-1

考虑:

class X:

    def some_method(self):
        print("X.some_method called")

class Y:

    def some_method(self):
        print("Y.some_method called")

class Foo(X,Y):

    def some_method(self):

        super().some_method()
        # plus some Foo-specific work to be done here

foo_instance = Foo()
foo_instance.some_method()

输出:

X.some_method called

将 Foo 的类声明改为:

class Foo(Y,X):

将输出更改为:

Y.some_method called

如果我想调用两个祖先方法,我可以将 Foo 的实现更改为:

def some_method(self):

    X().some_method()
    Y().some_method()
    # plus some Foo-specific work to be done here

这引出了我的问题。有没有什么超级秘密的方法可以让 Python 在所有祖先上调用该方法,而无需我像代码一样明确地这样做,例如(我在这里编造了 all_ancestors 关键字 - 这样的事情真的存在吗?):

def some_method(self):

    all_ancestors().some_method()
    # plus some Foo-specific work to be done here

预期输出为:

X.some_method called
Y.some_method called
4

2 回答 2

2

不,没有秘密的方法可以做到这一点。正如我在您的另一个问题中提到的那样,通常的方法是不要从单个后代类中调用所有祖先方法。相反,每个类应该super只调用一个祖先方法,即继承链上的下一个方法。如果树中的每个类都这样做(除了最顶层的基类),那么所有方法都将按顺序调用。换句话说, Foo 应该使用super(),这将调用X' 方法;然后X也应该使用super(),这将调用Y' 方法。

为了使这项工作正确,通常最好在继承树中有一个最顶层的类。在您的示例中,这将是一个作为 X 和 Y 基础的类。您需要这样一个类作为super调用序列的最后一站;这个基类不应该调用super。如果你只是不停super地到处调用,最终它会尝试调用基object类,然后失败,因为object没有提供你试图调用的方法。

于 2012-09-05T02:30:22.510 回答
0

如果您可以提供X&Y一个通用的基类或混合,这应该工作:

class ISomeMethod:
    def some_method(self):
        pass

class X(ISomeMethod):
    def some_method(self):
        print("X.some_method called")
        super(X, self).some_method()

class Y(ISomeMethod):
    def some_method(self):
        print("Y.some_method called")
        super(Y, self).some_method()

some_method然后应该按照您在 中声明基类的顺序调用Foo

于 2012-09-05T04:27:46.053 回答