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版本的解释器中,必须传参数(子类名,子类对象) #子类对象就是实例化对象






































































































posted @ 2018-04-16 15:29  Coca-Mirinda  阅读(130)  评论(0编辑  收藏  举报