python多继承中子类访问祖先类的同名成员

子类调用父类的同名成员

方式1:

class A:
    def f_a(self):
        print("----A----")

class B:
    def f_a(self):
        print("----B----")

class C(A, B):
    def f_a(self):
        A.f_a(self)  # 子类调用父类同名方法,括号里要写self,表明这是一个类调用
        B.f_a(self)  # 但这样如果修改了父类方法,那么子类就要多处修改
        print(‘----C----‘)

c = C()
c.f_a()

# ----A----
# ----B----
# ----C----

方式2:使用super()

class A:
    def f_a(self):
        print("----A----")

class B:
    def f_a(self):
        print("----B----")

class C(A, B):
    def f_a(self):
        A.f_a(self)
        super().f_a()
        print(‘----C----‘)

c = C()
c.f_a()
# ----A----
# ----A----
# ----C----

方式3:但super会有一个从左到右的继承顺序问题,默认是先继承左边,本例中为class A,如果我就是想用super()的方法调用B的成员,可以显式指明,如下例

class A:
    def f_a(self):
        print("----A----")

class B(A):
    def f_a(self):
        print("----B----")

class C(B):
    def f_a(self):
        super(B, self).f_a()  # 指B的父类
        super().f_a()  # super(C, self).f_a(), 指C的直接父类
#super第一个参数填的是当前类
        print(‘----C----‘)

c = C()
c.f_a()
# ----A----
# ----B----
# ----C----

方式4:再来一个例子,在多重继承中,最好显式指明super()当前类的父类

class A:
    def f_a(self):
        print("----A----")

class B(A):
    def f_a(self):
        print("----B----")

class C(B):
    def f_a(self):
        print(‘----C----‘)

class D(C):
    def f_a(self):
        super(D, self).f_a()  # class C‘s f_a
        super(C, self).f_a()  # class C‘s parent class‘s(B) f_a
        # super()
        print(‘----D----‘)
        pass

d = D()
d.f_a()

# ----C----
# ----B----
# ----D----

原文地址:https://www.cnblogs.com/sayiqiu/p/10562278.html

时间: 2024-11-06 15:32:47

python多继承中子类访问祖先类的同名成员的相关文章

访问祖先类的虚方法(直接访问祖先类的VMT,但是这种方法在新版本中未必可靠)

访问祖先类的虚方法 问题提出 在子类覆盖的虚方法中,可以用inherited调用父类的实现,但有时候我们并不需要父类的实现,而是想跃过父类直接调用祖先类的方法. 举个例子,假设有三个类,实现如下: type TClassA = class procedure Proc; virtual; end; TClassB = class(TClassA) procedure Proc; override; end; TClassC = class(TClassB) procedure Proc; ove

Python进阶-继承中的MRO与super

摘要本文讲述Python继承关系中如何通过super()调用"父类"方法,super(Type, CurrentClass)返回CurrentClass的MRO中Type的下一个类的代理:以及如何设计Python类以便正确初始化. 1. 单继承中父类方法调用 在继承中,调用父类方法是很有必要的.调用父类方法的场景有很多: 比如必须调用父类的构造方法__init__才能正确初始化父类实例属性,使得子类实例对象能够继承到父类实例对象的实例属性: 再如需要重写父类方法时,有时候没有必要完全摒

【转载】 C++多继承中重写不同基类中相同原型的虚函数

本篇随笔为转载,原文地址:C++多继承中重写不同基类中相同原型的虚函数. 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: virtual void TestA(); }; class CBaseB { public: virtual void TestB(); }; class CDerived : public CBaseA, public CBaseB { public: virtual void TestA()

Python多继承中的一些问题

https://docs.python.org/2/tutorial/classes.html#multiple-inheritance http://www.jackyshen.com/2015/08/19/multi-inheritance-with-super-in-Python/ http://python.jobbole.com/85685/ 在多继承中,如何访问父类中某个属性,是按照__mro__中的顺序确定的. 关于super(),原型是这样的: super(type[, obje

python之继承、抽象类、新式类和经典类

一.上节补充1.静态属性静态属性 : 类的属性,所有的对象共享这个变量 如果用对象名去修改类的静态属性:在对象的空间中又创建了一个属性,而不能修改类中属性的值 操作静态属性应该用类名来操作 例1:请你写一个类,能够统计一共实例化了多少个对象? class Foo: count = 0 def __init__(self): Foo.count += 1 f1 = Foo() print(f1.count) # 1 f2 = Foo() f3 = Foo() f4 = Foo() f5 = Foo

继承中子类构造函数相关问题

Day08_SHJavaTraing_4-13-2017 1.为什么任何一个类(不包含Object)的构造函数中都需要一个super() 语句? 因为除了Object类以外,所有类都会继承一个父类:继承父类,那么子类实例化时就需要给父类中的成员变量显示赋值,就需要用到父类中的构造函数. 2.如果父类中没有无参构造函数,子类如何实例化? super()表示调用父类无参构造函数:如果父类中没有无参构造函数,就会报错. 如何解决这个问题呢? 方法①在父类中添加一个无参构造函数 方法②在子类的构造函数中

python多继承中MRO问题

主要参考 http://python.jobbole.com/85685/ 算法更新顺序 DFS : 存在多继承中无法重写问题 BFS:存在继承单调性问题 C3算法:算法像是 拓扑排序+优先最左 的方式 原文地址:https://www.cnblogs.com/fuzzier/p/9897404.html

小鱼提问3 static方法中可以访问某个类的私有变量吗(不通过反射的其他非正常手段)?什么情况下可以?

? 1 2 3 4 5 6 7 8 9 10 11 12 class Student {     private string _name;     public int Age = 0;     public static void Test()     {         Student stu = new Student();         <span style="color: rgb(255, 0, 0);"><strong>stu._name =

C++模板编程中只特化模板类的一个成员函数

模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数.类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现1.2个成员函数即可.在这种情况下,如果全部重写该模板类的所有成员函数,不但会增加工作量,也不利于代码的维护. 例如下面的类模板A,只有在模板参数是char*时才需要特化成员函数func(),但其他的成员函数都不需要特化: 1 template <typename _Ty> 2 struct A 3 { 4 // 其他成员函数a 5 //