抽象类,子类调用父类的方法,super

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函数里需要添加类名

 

posted @ 2017-07-06 15:30  谷子的  阅读(3637)  评论(0编辑  收藏  举报