day 20 object类 + 继承于派生 + 钻石继承问题 + 钻石继承的深度优先算法(python3新式类,python2经典类)
Object 类:
class A:
'''
这是一个类
'''
a = class()
print(A.__dict__) #魔术方法,双下方法
创建一个空对象:调用了 __init__()方法,调用了吗?调用了
将初始化后的对象返回调用处
class Animal: def __init__(self,name,hp,ad): self.name = name self.hp = hp self.ad = ad def eat(self): print('%s in eating pear ' %self.name) class Person(Animal): def __init__(self,name,hp,ad,sex): super(Person,self).__init__(name,hp,ad) self.sex = sex def eat(self): # super().eat() print('%s in eating apples' %self.name) class Dog(Animal): def __init__(self,name,hp,ad,kind): super(Dog,self).__init__(name,hp,ad) self.kind = kind def eat(self): # super().eat() print('%s in eating ' %self.name) alex = Person('不存在',100,10,'不存在') xiaobai = Dog('小白',100,1,'牛奶甜') alex.eat() xiaobai.eat()
父类有eat,子类没有
alex.eat() 找父类的
子类中有,如果没有supper()的话,不会去父类中寻找
当子类中有,我还想要调父类的方法 肿么办? 嗯哼
哈哈哈哈 有两种方法:
在内部
1.类名.方法名(参数) 需要先进行实例化
2.实例化对象之后 super().方法名()
在外部:
第二种方式 supper()里面必须加参数
钻石继承问题:
在python3环境中。只有新式类:新式类单继承中就是单纯的寻找父类,再多继承中就是根据子节点所在图的mro顺序寻找下一个类:
遇到多继承和supper() 注意:python3中的新式类都继承object类
对象,方法
1.找到这个对象对应的类
2.将这个类的父类都画到一个图
3.根据这个图,写出广度优先的顺序
4.再看代码,看代码的时候要根据广度优先的顺序图来找相应的supper
PS:一句话总结:在python3中 新式类 遵循:广度优先遍历算法
在python2环境中。主要是经典类:
1.经典类,必须不继承object
2.没有mro方法
3.经典类中没有supper
4.遍历的时候需要遵循深度优先算法
在python2环境中。可以有新式类:
1.遍历的时候遵循广度优先算法
2.在新式类中有mro方法
3.有supper方法,但是在2.x版本的解释器中,必须传参数(子类名,子类对象) #子类对象就是实例化对象