python学习day24 继承 派生

 继承

class A(object):pass   # 父类,基类,超类 object是类祖宗,一般默认不写
class B:pass   # 父类,基类,超类
class A_son(A,B):pass # 子类,派生类
class AB_son(A):pass # 子类,派生类
# 一个类 可以被多个类继承
# 一个类 可以继承多个父类  —— python里
print(AB_son.__bases__) # 查看父类
print(A.__bases__)  # (<class 'object'>) 类祖宗

 

 有的类中属性、方法会重用,就可以用继承

 

 

 如果没有__init__,就执行父类__init__

父类没有的方法,子类有的:派生属性

父类没有的方法,子类有的:派生方法

 

class Animal:
    def __init__(self,name,aggr,hp):
        self.name = name
        self.aggr = aggr
        self.hp = hp

    def eat(self):
        print('吃药回血')
        self.hp+=100
#
class Dog(Animal):
    def __init__(self,name,aggr,hp,kind):
        Animal.__init__(self,name,aggr,hp)  #
        self.kind = kind       # 派生属性
    def eat(self):
        Animal.eat(self)   # 如果既想实现新的功能也想使用父类原本的功能,还需要在子类中再调用父类
        self.teeth = 2
    def bite(self,person):   # 派生方法
        person.hp -= self.aggr

jin = Dog('金老板',100,500,'吉娃娃')
jin.eat()  # 调用子类,如果子类中没有,调用父类的方法
print(jin.hp)

super() 调用父类  Dog类可变为下面:

class Dog(Animal):
    def __init__(self,name,aggr,hp,kind):
        super().__init__(name,aggr,hp)  # 只在新式类中有,python3中所有类都是新式类
        self.kind = kind       # 派生属性
    def eat(self):print('dog eating')

jin = Dog('金老板',200,500,'teddy')

super(Dog,jin).eat()  # 'dog eating'

 

多继承

钻石继承

class A:pass
    def func(self): print('A')
class B(A):
    pass
    # def func(self): print('B')
class C(A):pass
    def func(self): print('C')

class D(B,C):
    pass
    # def func(self):print('D')

d = D()
d.func()  # C 先找B,B找不到再找它的兄弟C 而不是A

新式类中的继承顺序 : 广度优先

新式类就是继承obkect   py3中所有类都是新式类

小乌龟问题

查看继承顺序:

print(D.mro())   # 从子类按照广度优先一直追溯到object类

 

经典类:

 深度优先,一条路走到黑

 

 总结:

# 新式类 继承object类的才是新式类 广度优先
# 经典类 如果你直接创建一个类 在2.7中就是经典类 深度优先
# print(D.mro())
# D.mro()

# 单继承 : 子类有的用子类 子类没有用父类
# 多继承中,我们子类的对象调用一个方法,默认是就近原则,找的顺序是什么?
# 经典类中 深度优先
# 新式类中 广度优先
# python2.7 新式类和经典类共存,新式类要继承object
# python3   只有新式类,默认继承object
# 经典类和新式类还有一个区别  mro方法只在新式类中存在
# super 只在python3中存在
# super的本质 :不是单纯找父类 而是根据调用者的节点位置的广度优先顺序来的

 

 注意第6步 跳到class C

super的本质 :不是单纯找父类 而是根据调用者的节点位置的广度优先顺序来的

 

 

 

 

 

2018.11.17

posted @ 2018-11-16 20:30  xyfun72  阅读(116)  评论(0编辑  收藏  举报