我想调用父类方法,该方法在Python中通过子类对象在子类中被覆盖

时间:2020-07-01 10:05:53

标签: python python-3.x python-object python-class

class abc():
    def xyz(self):
        print("Class abc")

class foo(abc):
    def xyz(self):
        print("class foo")

x = foo()

我想调用父类的xyz()之类的东西;

x.super().xyz()

1 个答案:

答案 0 :(得分:0)

使用这种单继承,我认为最简单的方法是通过类调用方法,并显式传递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