获取多级继承类的父级的父级属性

时间:2019-05-16 23:18:56

标签: python

让我们想象以下类结构:

class A:
    def t(self):
        print("a")

class B(A):
    def t(self):
        super().t()
        print("b")

我希望从C继承的类B开始,仅使用A.t()关键字运行super方法,以便运行

c=C()
c.t()

仅打印

a

有关信息,让我们假设我确实希望C的行为像B,对于方法t()来说,例外,它必须完全绕过{ {1}}覆盖B.t()

我尝试了

A.t()

返回class C(B): def t(self): super().super().t()

我也尝试过

AttributeError: 'super' object has no attribute 'super'

返回class C(B): def t(self): A.t()

很明显,我做错了。有人可以告诉我如何继承第二个父级的方法,同时仍然继承第一个父级的方法吗?

3 个答案:

答案 0 :(得分:2)

您可以重新设计类层次结构,以使BC都继承自A的公共子类,该子类实现了当前B类实现的所有方法,除了方法t,该方法留给新的B类来单独实现:

class A:
    def t(self):
        print("a")

class SubA(A):
    def other_method(self):
        pass

class B(SubA):
    def t(self):
        super().t()
        print("b")

class C(SubA):
    pass

答案 1 :(得分:0)

正如我在评论中提到的那样,您可以使用AVAudioPlayer来实现自己的目标。

但是..似乎没有必要这样做。

A.t(self)

答案 2 :(得分:0)

这太残忍了,您永远都不要这么做,但是 是可能的。

请记住,bytes = IOUtils.toByteArray(new FileReader(file)); super()的缩写,但是在MRO中传递 any 类作为第一个参数是合法的。

即使替换了全局变量(例如,用super(__class__, self_or_whatever_the_first_argument_is)),下面的代码也可以使用,但是如果其他内容从imp.reload继承并在MRO中位于C和B之间,则下面的代码将无效。如果您用硬编码B代替B,则将跳过此类,如果替换了全局变量,它将中断。

next_class