让我们想象以下类结构:
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()
。
很明显,我做错了。有人可以告诉我如何继承第二个父级的方法,同时仍然继承第一个父级的方法吗?
答案 0 :(得分:2)
您可以重新设计类层次结构,以使B
和C
都继承自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