抽象类,子类调用弗雷的方法,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-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

抽象类,子类调用弗雷的方法,super的相关文章

python基础之继承实现原理、子类调用父类的方法、封装

继承实现原理 python中的类可以同时继承多个父类,继承的顺序有两种:深度优先和广度优先. 一般来讲,经典类在多继承的情况下会按照深度优先的方式查找,新式类会按照广度优先的方式查找 示例解析: 没有共同头部父类的类型 1 class E: 2 def test(self): 3 print('from E') 4 # pass 5 class F: 6 def test(self): 7 print('from F') 8 # pass 9 10 class C: 11 def test(se

python子类调用父类的方法

python子类调用父类的方法 python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法.如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问,但是该方法或属性在子类中并不存在,那么就会自动的去其父类中进行查找. 继承父类后,就能调用父类方法和访问父类属性,而要完成整个集成过程,子类是需要调用的构造函数的. 子类不显式调用父类的构造方法,而父类构造函数初始化了一些属性,就会出现问题 如果子类和父类都有构造函数,子类其实是重写了父类的构造函数

Python_子类调用父类的方法

1.方式一子类调用父类的方法,包含2中形式的调用.一种形式是在类内部通过继承的方式调用父类的方法,另外一种形式是子类实例化后之后通过继承的方式来调用父类的方法.如下图所示:注意一点,在子类内部通过继承的方式调用父类的属性时,必须要带上self位置参数(self只在实例化过程中和在实例调用属性时才能省略(self本来的含义就是指向实例自己)):而实例在通过继承调用父类的属性或方法时,则不用传self参数,因为实例已经实例化了呀!!!该部分的代码块如下:注意一点,在子类内部通过继承的方式调用父类的属

8.python之面相对象part.5(子类调用父类的方法,以及super关键字)

python中子类要调用父类的某个方法,在python早期版本中是这样实现的: class A: def __init__(self): print "enter A" print "leave A" class B(A): def __init__(self): print "enter B" A.__init__(self) print "leave B" b = B() >>>enter B enter

java继承-子类调用父类的方法中包含子类重写的方法

# 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了... # 先看代码: public class Common { public static void main(String[] args) { Sub sub = new Sub(); sub.testSub(); } } class Parent { protected boolean test() { throw new RuntimeException(); } protected void testParent() { if

Python__子类调用父类的方法

# class OldboyPeople:# school = 'oldboy'# def __init__(self,name,age,sex):# self.name=name# self.age=age# self.sex=sex## def eat(self):# print('is eating')# def teach(self):# print('这是父类的teach')## class OldboyTeacher(OldboyPeople):# def __init__(self

Java -- 子类使用super调用父类的方法A,A 调用了方法B,子类也override方法B,那么super.A()最终调用到了子类的B方法

public class SuperClass{ public void printA(){ System.out.print("SuperClass-printA"); printB(); } public void printB(){ System.out.print("SuperClass-printB"); } } public class ChildClass extends SuperClass{ public void printA(){ System

Python基础-接口与归一化设计、抽象类、继承顺序、子类调用父类,多态与多态性

一.接口与归一化设计 Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 由于python中没有Interface方法,根据Java接口的定义,可以抽象出python中的接口:一个类所具有的方法的特征集合. 可以通过继承来实现接口方法,在python中,继承有两种用途: 继承基类的方法,并且做出自己的改变或者扩展(代码重用) 声明某个子类兼容于某基类,定义一个接口类Inte

继承实现的原理、子类中调用父类的方法、封装

一.继承实现的原来 1.继承顺序 Python的类可以继承多个类.继承多个类的时候,其属性的寻找的方法有两种,分别是深度优先和广度优先. 如下的结构,新式类和经典类的属性查找顺序都一致.顺序为D--->A--->E--->B--->C. class E: def test(self): print('from E') class A(E): def test(self): print('from A') class B: def test(self): print('from B'