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.菱形继承