1\
抽象类
子类 必须与子类一样的函数名,
限制了子类名必须与父类名一样,就定义了一个标准,做统一,
抽象类,不能被实例化,作用就是定义标准,不用具体实例化
1 Python本身不提供抽象类和接口机制,要想实现抽象类, 2 可以借助abc模块。ABC是Abstract(摘要) Base(基础,底部) Class的缩写。 3 4 5 abc.ABCMeta 这是用来生成抽象基础类的元类。由它生成的类可以被直接继承。 6 7 import abc 8 class File(mataclass=abc.ABCMeta): 9 10 @abc.abstractclassmethod #表明抽象方法的生成器 11 # def read(self): 12 pass 13 14 @abc.abstractclassmethod 15 def write(self): 16 pass 17 18 class Txt(File): #文本,具体实现read和write 19 def read(self): 20 pass 21 def write(self): 22 pass 23 t=Txt()
2\继承的实现原理
Python3中都是新式类,以广度优先,从左到右,先找左边分支,找完没有,再找右边分支,
Python2中,只有加了object才是 新式类,不加object的都是经典类,在经典类里找继承关系是深度优先
python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表
class A(object): def test(self): print(‘from A‘) pass class B(A): # def test(self): # print(‘from B‘) pass class C(A): # def test(self): # print(‘from C‘) pass class D(A): # def test(self): # print(‘from D‘) pass class E(B): # def test(self): # print(‘from E‘) pass class F(C): # def test(self): # print(‘from F‘) pass class G(D): # def test(self): # print(‘from G‘) pass class H(E,F,G): # def test(self): # print(‘from H‘) pass h=H() # h.test=1 # print h.__dict__ #新式类的在这中继承结构下,属性的查找关系 # h.test() # H->E->B->F->C-G-D-A 广度优先 #mro print(H.mro())
#coding:utf-8class A: # def test(self): # print(‘from A‘) passclass B(A): # def test(self): # print(‘from B‘) passclass C(A): # def test(self): # print(‘from C‘) passclass D(A): # def test(self): # print(‘from D‘) passclass E(B): # def test(self): # print(‘from E‘) passclass F(C): # def test(self): # print(‘from F‘) passclass G(D): # def test(self): # print(‘from G‘) passclass H(E,F,G): # def test(self): # print(‘from H‘) passh=H() #经典类的在这中继承结构下,属性的查找关系h.test() # H-E-B-A-F-C-G-D 深度优先
3\子类调用父类的方法
super __init__ 是根据新式类的mro算法得到,只能在新式类里得到,
class People: def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def foo(self): print(‘from parent‘) class Teacher(People): def __init__(self,name,age,sex,salary,level): # People.__init__(self,name,age,sex) #指名道姓地调用People类的__init__函数 #在python3中 super().__init__(name,age,sex) #调用父类的__init__的功能,实际上用的是绑定方法 #在python2中 # super(Teacher,self).__init__(name,age,sex) self.salary=salary self.level=level def foo(self): super().foo() print(‘from child‘) t=Teacher(‘egon‘,18,‘male‘,3000,10)# print(t.name,t.age,t.sex,t.salary,t.level)t.foo()#
引用父类的数据属性是指名道姓的引用,不用考虑父类的名字
在Python2中,需要在super函数里需要添加类名
时间: 2024-10-05 04:19:34