继承
继承本质就是为实现代码的复用!
属性和方法的继承
class RichMan(object):
def __init__(self):
self.money = 100000000000000000000000000000000000000
self.company = "alibaba"
def worlds(self):
print("我不喜欢钱,我对钱不感兴趣")
print("我好久没有见到钱了")
class Son(RichMan):
def my_worlds(self):
print("哈哈,从此以后,我就可以不用努力啦!!!")
if __name__ == '__main__':
show_me = Son()
print(show_me.money)
print(show_me.company)
show_me.worlds()
show_me.my_worlds()
运行结果:
100000000000000000000000000000000000000
alibaba
我不喜欢钱,我对钱不感兴趣
我好久没有见到钱了
哈哈,从此以后,我就可以不用努力啦!!!
私有属性和方法的继承
class RichMan(object):
def __init__(self):
self.money = 100000000000000000000000000000000000000
self.company = "alibaba"
self.__secretary = "小雅"
def worlds(self):
print("我不喜欢钱,我对钱不感兴趣")
print("我好久没有见到钱了")
def __tell_worlds(self):
print("大家好,我真的对钱一点兴趣都没有!")
class Son(RichMan):
def my_worlds(self):
print("哈哈,从此以后,我就可以不用努力啦!!!")
if __name__ == '__main__':
show_me = Son()
print(show_me.money)
print(show_me.company)
show_me.worlds()
show_me.my_worlds()
print(show_me.__secretary)
show_me.__tell_worlds()
运行结果:
Traceback (most recent call last):
File "E:/Users/DELL/Desktop/Python Study/object_oriented/面向对象--继承1.py", line 28, in <module>
print(show_me.__secretary)
AttributeError: 'Son' object has no attribute '__secretary'
100000000000000000000000000000000000000
alibaba
我不喜欢钱,我对钱不感兴趣
我好久没有见到钱了
哈哈,从此以后,我就可以不用努力啦!!!
注:有上面案例可以得出结论,输了 私有属性 和 私有方法 ,都可以继承。
方法重写:
在继承基础上,如果子类方法父类的方法不能满足自己使用的时候,那么就重写这个方法 注意:覆盖时:方法名称和参数必须一模一样
class RichMan(object):
def __init__(self):
self.money = 100000000000000000000000000000000000000
self.company = "alibaba"
def worlds(self):
print("我不喜欢钱,我对钱不感兴趣")
print("我好久没有见到钱了")
def working(self):
print("我是大boss")
print("整个公司我最伟大")
class Son(RichMan):
def my_worlds(self):
print("哈哈,从此以后,我就可以不用努力啦!!!")
if __name__ == '__main__':
show_me = Son()
print(show_me.money)
print(show_me.company)
show_me.worlds()
show_me.my_worlds()
show_me.working()
运行结果:
100000000000000000000000000000000000000
alibaba
我不喜欢钱,我对钱不感兴趣
我好久没有见到钱了
哈哈,从此以后,我就可以不用努力啦!!!
我是大boss
整个公司我最伟大
class RichMan(object):
def __init__(self):
self.money = 100000000000000000000000000000000000000
self.company = "alibaba"
def worlds(self):
print("我不喜欢钱,我对钱不感兴趣")
print("我好久没有见到钱了")
def working(self):
print("我是大boss")
print("整个公司我最伟大")
class Son(RichMan):
def my_worlds(self):
print("哈哈,从此以后,我就可以不用努力啦!!!")
def working(self):
print("我才是王者,谁敢不服我")
print("你不服我,你试试!")
if __name__ == '__main__':
show_me = Son()
print(show_me.money)
print(show_me.company)
show_me.worlds()
show_me.my_worlds()
show_me.working()
运行结果:
100000000000000000000000000000000000000
alibaba
我不喜欢钱,我对钱不感兴趣
我好久没有见到钱了
哈哈,从此以后,我就可以不用努力啦!!!
我才是王者,谁敢不服我
你不服我,你试试!
supper:
super关键字
super 是一个指针,默认指向父类
在子类中调用父类的方法或者属性
class RichMan(object):
def __init__(self):
self.money = 100000000000000000000000000000000000000
self.company = "alibaba"
def worlds(self):
print("我不喜欢钱,我对钱不感兴趣")
print("我好久没有见到钱了")
def working(self):
print("我是大boss")
print("整个公司我最伟大")
class Son(RichMan):
def my_worlds(self):
print("哈哈,从此以后,我就可以不用努力啦!!!")
def working(self):
print("我才是王者,谁敢不服我")
print("你不服我,你试试!")
def my_supper(self):
self.working()
if __name__ == '__main__':
show_me = Son()
show_me.my_supper()
运行结果:
我才是王者,谁敢不服我
你不服我,你试试!
添加super
class RichMan(object):
def __init__(self):
self.money = 100000000000000000000000000000000000000
self.company = "alibaba"
def worlds(self):
print("我不喜欢钱,我对钱不感兴趣")
print("我好久没有见到钱了")
def working(self):
print("我是大boss")
print("整个公司我最伟大")
class Son(RichMan):
def my_worlds(self):
print("哈哈,从此以后,我就可以不用努力啦!!!")
def working(self):
print("我才是王者,谁敢不服我")
print("你不服我,你试试!")
def my_supper(self):
super().working()
if __name__ == '__main__':
show_me = Son()
show_me.my_supper()
运行结果:
我是大boss
整个公司我最伟大
class User(object):
def __init__(self):
print("我是父类")
class Admin(User):
def __init__(self):
print("我是子类")
show_info = Admin()
运行结果:
我是子类
class User(object):
def __init__(self):
print("我是父类")
class Admin(User):
def __init__(self):
super().__init__()
print("我是子类")
show_info = Admin()
运行结果:
我是父类
我是子类
class User(object):
def __init__(self):
print("我是父类")
class Admin(User):
def __init__(self):
print("我是子类")
super().__init__()
show_info = Admin()
运行结果:
我是子类
我是父类
结论:子类初始化函数的调用,并不会触发父类初始化函数的调用,若要调用父类,需要使用supper关键字调用。(这也是Python与其他面向对象语言的区别)
|