1. 程式人生 > >抽象類,子類調用弗雷的方法,super

抽象類,子類調用弗雷的方法,super

經典 clas 沒有 meta 文本 優先 base pri bst

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-8
class A:
# 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()

# 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函數裏需要添加類名

抽象類,子類調用弗雷的方法,super