繁体   English   中英

I want to call parent class method which is overridden in child class through child class object in Python

[英]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()

使用像这样的单个 inheritance,我认为通过 class 调用该方法是最简单的,并显式传递self

abc.xyz(x)

使用super更通用,这将变成(尽管我想不出一个好的用例):

super(type(x), x).xyz()

它返回一个超级 object ,它可以被认为是父 class 但子是self

如果您想要与您的语法完全相同的东西,只需为您的 class 提供一个超级方法(您的abc class,所以继承的每个人都会拥有它):

def super(self):
    return super(type(self), self)

现在x.super().xyz()可以工作了。 如果您从foo继承 class ,它将中断,因为您只能将 go 提高一级(即回到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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM