Способ вызова супер (MyClass, самостоятельно) .__ init __ () без MyClass? - PullRequest
4 голосов
/ 29 марта 2010

Я нахожу этот синтаксис поразительно раздражающим. Каждый раз, когда я переименовываю свой класс, я должен изменить этот призыв без видимой причины. Есть ли какая-нибудь магическая переменная __class__ или что-то, что я могу использовать по крайней мере? Интересует ответы для Python 2.5, но не помешает узнать, исправили ли это более поздние версии.

Ответы [ 5 ]

4 голосов
/ 29 марта 2010
4 голосов
/ 29 марта 2010

Насколько я знаю, это невозможно в 2.5. Однако в 3.0 это было изменено, так что вы можете просто позвонить super().__init__().

3 голосов
/ 29 марта 2010

Если ваш класс наследует только от одного класса, это можно сделать следующим образом:

class B(A):
    def __init__(self):
        A.__init__(self)

Но я могу ошибаться.

2 голосов
/ 29 марта 2010

В Python 3.0 super () можно вызывать без аргументов, чтобы сделать то же самое.

0 голосов
/ 29 марта 2010

РЕДАКТИРОВАТЬ: Как указал Алекс, это вызывает бесконечную рекурсию, когда существует более одного уровня наследования. Не используйте этот подход.

Да, у «новых» классов стилей есть атрибут __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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...