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

Posted 开心大人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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----

 

以上是关于python多继承中子类访问祖先类的同名成员的主要内容,如果未能解决你的问题,请参考以下文章

2017/03/19学习笔记

继承,虚继承机制

Java---继承

继承1

Java基础 成员变量的继承与覆盖

什么是类的继承性?Java中子类和父类有什么关系?