继承
python中继承分为单继承和多继承
class parent1: #如果没有继承,python3中会默认继承object这个类
pass
class parent2:
pass
class son1(parent1): #单继承,父类是parent1
pass
class son2(parent1,parent2): #多继承,父类是parent1和parent2
pass
- 继承的特性
子类会继承父类的所有属性和方法,但是在子类中重新定义了父类已有的方法或属性,子类调用时会调用子类定义的方法或属性
class parent1:
a=12
pass
class parent2:
pass
class son1(parent1):
a=13
pass
class son2(parent1,parent2):
pass
print(parent1.a,son1.a,son2.a)
#12 13 12 方法也是类似的
继承的顺序
继承关系如箭头所示,当A调用一个方法或属性时,如果A中没有定义,就会去B里面找,B再没有去C找,依次是EFGD
class D:
pass
class C(D):
pass
class F(D):
pass
class B(C):
pass
class E(F):
pass
class G(D):
pass
class A(B,E,G):
pass
print(A.mro()) #这个是方法解析顺序列表
#[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.E'>, <class '__main__.F'>, <class '__main__.G'>, <class '__main__.D'>, <class 'object'>]
- 子类中调用父类的方法
class parent:
def __init__(self,name,age):
self.name=name
self.age=age
class son(parent):
def __init__(self,name,age,sex):
super().__init__(name,age)
self.sex=sex
s=son('k',12,'man')
print(s.__dict__) # {'name': 'k', 'age': 12, 'sex': 'man'}
#__dict__是属性字典
- 接口
规定一些类共有的方法但不实现,实现是由实现(继承)了这个接口的子类完成
import abc
class animal(metaclass=abc.ABCMeta): #animal 就是个接口
@abc.abstractmethod
def cry(self):
pass
@abc.abstractmethod
def eat(self):
pass
class dog(animal): #dog 这个类实现了animal这个接口
def __init__(self,name):
self.name=name
def cry(self):
print('汪汪汪')
def eat(self,food):
print('%s正在吃%s'%(self.name,food))
class cat(animal):
def __init__(self, name):
self.name = name
def cry(self):
print('喵喵喵')
d=dog('蛋黄')
c=cat('毛毛') # 由于cat这个类没有实现animal接口中的eat方法,所以在实例化时会报错