zoukankan      html  css  js  c++  java
  • 抽象类,子类调用父类的方法,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函数里需要添加类名

  • 相关阅读:
    C#实现程序的版本升级更新
    c#获取系统内存等信息
    C# 时间格式设置
    SMS(System Management Server)学习笔记。
    C#调用WMI获取本机MAC地址列表。
    sharepoint portal service 一处隐蔽应用。
    ubuntu安装显卡驱动后亮度不能调节问题
    linux下boost编译及链接到系统目录
    在windows下修改右键菜单以实现使用vs2010快速编译代码
    vs2010使用boost::interpocess编译出错
  • 原文地址:https://www.cnblogs.com/gyh04541/p/7126588.html
Copyright © 2011-2022 走看看