我想通过 Python 中的子 class 对象调用子 class 中覆盖的父 class 方法
I want to call parent class method which is overridden in child class through child class object in Python
class abc():
def xyz(self):
print("Class abc")
class foo(abc):
def xyz(self):
print("class foo")
x = foo()
我想调用父 class 的 xyz(),类似于;
x.super().xyz()
像这样的单一继承在我看来最简单的方法是通过 class 调用方法,然后显式传递 self
:
abc.xyz(x)
使用 super
更通用这将变成(尽管我想不出一个好的用例):
super(type(x), x).xyz()
哪个 returns 一个超级对象可以被认为是父对象 class 但子对象是 self
.
如果您想要与您的语法完全相同的东西,只需为您的 class(您的 abc
class 提供一个超级方法即可:
def super(self):
return super(type(self), self)
现在 x.super().xyz()
可以工作了。如果您从 foo
继承 class,它会中断,因为您将只能向上一级(即返回 foo
)。
据我所知,没有“通过对象”访问隐藏方法的方法。
只是为了好玩,这里有一个更强大的版本,允许使用专用的 class 跟踪 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
class abc():
def xyz(self):
print("Class abc")
class foo(abc):
def xyz(self):
print("class foo")
x = foo()
我想调用父 class 的 xyz(),类似于;
x.super().xyz()
像这样的单一继承在我看来最简单的方法是通过 class 调用方法,然后显式传递 self
:
abc.xyz(x)
使用 super
更通用这将变成(尽管我想不出一个好的用例):
super(type(x), x).xyz()
哪个 returns 一个超级对象可以被认为是父对象 class 但子对象是 self
.
如果您想要与您的语法完全相同的东西,只需为您的 class(您的 abc
class 提供一个超级方法即可:
def super(self):
return super(type(self), self)
现在 x.super().xyz()
可以工作了。如果您从 foo
继承 class,它会中断,因为您将只能向上一级(即返回 foo
)。
据我所知,没有“通过对象”访问隐藏方法的方法。
只是为了好玩,这里有一个更强大的版本,允许使用专用的 class 跟踪 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