class abc():
def xyz(self):
print("Class abc")
class foo(abc):
def xyz(self):
print("class foo")
x = foo()
我想调用父类的 xyz() ,例如;
x.super().xyz()
class abc():
def xyz(self):
print("Class abc")
class foo(abc):
def xyz(self):
print("class foo")
x = foo()
我想调用父类的 xyz() ,例如;
x.super().xyz()
像这样的单一继承,我认为通过类调用方法并self
显式传递是最简单的:
abc.xyz(x)
使用super
更通用,这将成为(尽管我想不出一个好的用例):
super(type(x), x).xyz()
它返回一个超级对象,可以将其视为父类,但子类为self
.
如果您想要与您的语法完全相同的东西,只需为您的类提供一个超级方法(您的abc
类,因此每个继承的人都会拥有它):
def super(self):
return super(type(self), self)
现在x.super().xyz()
可以工作了。但是,如果您创建一个继承自 的类,它将中断foo
,因为您将只能上一级(即回到foo
)。
我知道没有“通过对象”访问隐藏方法的方式。
只是为了好玩,这是一个更强大的版本,允许使用专用类跟踪调用链接超级super
调用:
class Super:
def __init__(self, obj, counter=0):
self.obj = obj
self.counter = counter
def super(self):
return Super(self.obj, self.counter+1)
def __getattr__(self, att):
return getattr(super(type(self.obj).mro()[self.counter], self.obj), att)
class abc():
def xyz(self):
print("Class abc", type(self))
def super(self):
return Super(self)
class foo(abc):
def xyz(self):
print("class foo")
class buzz(foo):
def xyz(self):
print("class buzz")
buzz().super().xyz()
buzz().super().super().xyz()
结果是
class foo
Class abc