如何调用super(MyClass,self).__ init __()而不使用MyClass?

时间:2010-03-28 23:35:57

标签: python syntax

我发现这种语法令人震惊。每次我重新命名我的班级时,我都不得不改变这个电话。是不是有一些__class__魔法变量或者我至少可以使用的东西?对Python 2.5的答案感兴趣,但是知道以后的版本是否修复了这个问题并没有什么坏处。

5 个答案:

答案 0 :(得分:4)

据我所知,这在2.5中是不可能的。但是,在3.0中,这已被更改,因此您只需拨打super().__init__()

即可

答案 1 :(得分:4)

答案 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