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

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

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 的初始化程序(这会以无限递归结束)。

暂时不需要考虑菱形继承(钻石问题),我只是对解决这个特定问题感兴趣。

最佳答案

Python 3 包含一个改进的 super(),它允许像这样使用:

super().__init__(args)

https://stackoverflow.com/questions/904036/

相关文章:

python - 如何使用 Python 重命名文件

python - 在 Python 中打印多个参数

python - '太多的值无法解包',迭代一个字典。键=>字符串,值=>列表

python - 漂亮地打印一个没有科学记数法和给定精度的 NumPy 数组

python - 如何将本地时间字符串转换为 UTC?

python - pandas:使用运算符链接过滤 DataFrame 的行

python - 在 Python 中将 datetime.date 转换为 UTC 时间戳

python - 为什么访问全局变量不需要 'global' 关键字?

python - 为什么使用 argparse 而不是 optparse?

python - 动态打印一行