python笔记(继承,钻石继承,漏斗继承...)

class A:pass #父类,基类,超类
class B:pass #父类,基类,超类
class A_son(A,B):pass#子类,派生类
print(A_son.__bases__)
print(A.__bases__)

输出结果:

(<class ‘main.A’>, <class ‘main.B’>)
(<class ‘object’>,) #没有继承,默认继承object类
一个类可以被多个类继承
一个类可以继承多个父类

1.单继承

class Animal:
    def __init__(self,name,hp,aggr,sex):   #初始化方法,self是对象
        self.name = name
        self.hp = hp
        self.aggr = aggr
        self.sex = sex
    def eat(self):
        print('回血')
        self.hp += 3
class Person(Animal):
    def __init__(self, name, hp, aggr, sex,high):  # 初始化方法,self是对象
        Animal.__init__(self,name,hp,aggr,sex)   #若继承比父类多一个属性,需要初始化属性
        self.high = high                       #派生属性
    def eat(self):
        Animal.eat(self)                     #想使用与父类一样的方法,需要再调用父类
        self.high += 1
class Dog(Animal):
    def __init__(self,name,hp,aggr,sex,eea):
        super().__init__(name,hp,aggr,sex) #只有新式类中有,python3中所有的类都是新式类
        self.eea = eea
    def bite(self,person):                      #派生方法
        person.hp -= self.aggr
    def eat(self):
        print('回腿')
        self.eea += 1
long = Person('longlong',200,3,'男',7)
geng = Dog('geng',100,2,None,6)
geng.eat()               #使用自己的eat()方法
super(Dog,geng).eat()    #使用父类的eat()方法

输出结果:

回腿
回血

@若子类和父类有一个同名的方法,首先选择子类

2.多继承(正常代码用单继承)

class A:
    def func(self):print('A')
class B:
    def func(self):print('B')
class C:
    def func(self): print('C')
class D(A,B,C):
    pass
d = D()
d.func() #离的最近的func方法,因该是A的

3.钻石继承

   /\
   \/

   class A:
        def func(self):print('A')
    class B(A):
        def func(self):print('B')
    class C(A):
        def func(self): print('C')
    class D(B,C):
        pass
    d = D()
    d.func() #离的最近的func方法,因该是B的,若B中没有func该找C的若B,C中都没有,该找A的

4.漏斗继承

'''
| |
\ /
'''
class A:
    def func(self):print('A')
class E:
    def func(self):print('E')
class B(A):
    def func(self):print('B')
class C(E):
    def func(self): print('C')
class D(B,C):
    pass
print(D.mro())  #可记录继承路径
d = D()
d.func() #离的最近的func方法,因该是B的,若B中没有func,该找A的,若A中也都没有该找C的

输出结果:

[<class ‘main.D’>, <class ‘main.B’>, <class ‘main.A’>, <class ‘main.C’>, <class ‘main.E’>, <class ‘object’>]
B

(1)经典类深度优先 python2.7新式经典共存,新式类要继承object
(2)新式类广度优先 python3.7只有新式类,默认继承object,mor,super方法只有新式类中有,super只在python3.7中有
(3)super的本质:不是直接找父类,而是根据调用者的节点位置的广度优先顺序来的

5.菱形继承
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值