这个问题在这里已经有了答案:How to invoke the super constructor in Python? (7 个回答) 5 年前关闭。
考虑一下-基类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 的初始化程序(这以无限递归结束)。
现在不需要考虑钻石继承,我只是对解决这个特定问题感兴趣。
Python 3 包含一个改进的 super() ,它允许像这样使用:
super().__init__(args)
您这样做的方式确实是推荐的方式(对于 Python 2.x)。
类是否显式传递给 super
的问题是样式问题而不是功能问题。将类传递给 super
符合 Python 的“显式优于隐式”的理念。
TypeError: super() argument 1 must be type, not classobj
。我错过了什么吗?
super()
仅适用于新式类,即您必须从 object
继承。
你可以简单地写:
class A(object):
def __init__(self):
print "Initialiser A was called"
class B(A):
def __init__(self):
A.__init__(self)
# A.__init__(self,<parameters>) if you want to call with parameters
print "Initialiser B was called"
class C(B):
def __init__(self):
# A.__init__(self) # if you want to call most super class...
B.__init__(self)
print "Initialiser C was called"
不定期副业成功案例分享
MyClassName.mro()
来找到它。我可能不正确,但我相信第一个指定的父级是__init__
将被调用的那个。