小编典典

python中的链式调用父初始化器

all

考虑一下-基类A,从A继承的B类,从B继承的C类。在初始化程序中调用父类初始化程序的通用方法是什么?如果这听起来仍然太模糊,这里有一些代码。

class A(object):
    def __init__(self):
        print "Initialiser A was called"

class B(A):
    def __init__(self):
        super(B,self).__init__()
        print "Initialiser B was called"

class C(B):
    def __init__(self):
        super(C,self).__init__()
        print "Initialiser C was called"

c = C()

这就是我现在的做法。但它似乎仍然有点太不通用 - 你仍然必须手动传递正确的类型。

现在,我尝试将self.__class__它用作 super() 的第一个参数,但是,显然它不起作用——如果你把它放在 C 的初始化程序中——很公平,B
的初始化程序会被调用。如果你在 B 中做同样的事情,“self”仍然指向 C 的一个实例,所以你最终会再次调用 B 的初始化程序(这以无限递归结束)。

现在不需要考虑钻石继承,我只是对解决这个特定问题感兴趣。


阅读 85

收藏
2022-04-25

共1个答案

小编典典

您这样做的方式确实是推荐的方式(对于 Python 2.x)。

是否将类显式传递给super的问题是样式问题而不是功能问题。传递类以super符合 Python 的“显式胜于隐式”的哲学。

2022-04-25