我发现这种语法令人震惊。每次我重新命名我的班级时,我都不得不改变这个电话。是不是有一些__class__
魔法变量或者我至少可以使用的东西?对Python 2.5的答案感兴趣,但是知道以后的版本是否修复了这个问题并没有什么坏处。
答案 0 :(得分:4)
据我所知,这在2.5中是不可能的。但是,在3.0中,这已被更改,因此您只需拨打super().__init__()
。
答案 1 :(得分:4)
这已在Python 3中修复。http://docs.python.org/py3k/library/functions.html#super
答案 2 :(得分:3)
如果您的课程仅继承自一个课程,则可以安全地执行此操作:
class B(A):
def __init__(self):
A.__init__(self)
但我可能会弄错。
答案 3 :(得分:2)
在Python 3.0中,可以不带参数调用super()来执行相同的操作。
答案 4 :(得分:-1)
编辑:正如Alex所指出的,当存在多个级别的继承时,这会导致无限递归。不要使用这种方法。
是的,“新”样式类可以使用__class__
属性,例如。
class B(object):
def __init__(self):
print "B.__init__():"
class D(B):
def __init__(self):
print "D.__init__():"
super(self.__class__, self).__init__()
>>> d = D()
D.__init__():
B.__init__():
>>> dir(d)
['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__']
>>> d.__class__
<class '__main__.D'>
但是,如果某个类要继承自D
:
>>> class E(D):
... pass
...
>>> E()
D.__init__():
D.__init__():
[...]
D.__init__():
D.__init__():
Traceback (most recent call last):
File "<stdin>", line 4, in __init__
File "<stdin>", line 4, in __init__
[...]
File "<stdin>", line 4, in __init__
File "<stdin>", line 4, in __init__
RuntimeError: maximum recursion depth exceeded while calling a Python object