Я нахожу этот синтаксис поразительно раздражающим. Каждый раз, когда я переименовываю свой класс, я должен изменить этот вызов без видимых причин. Разве нет какой-то __class__
волшебной переменной или что-то, что я могу использовать хотя бы? Заинтересованы в ответах на Python 2.5, но не мешает узнать, исправили ли в дальнейшем версии.Способ вызова super (MyClass, self) .__ init __() без MyClass?
ответ
Если ваш класс только наследует от один класса это безопасно делать только это:
class B(A):
def __init__(self):
A.__init__(self)
Но я мог бы ошибаться.
Нет ошибки - так оно и работает. –
Ох .. хорошо, это не так уж плохо! Почему бы это не работать, если он наследуется от более чем одного класса? Вы явно говорите, какой из них вы хотите использовать ... – mpen
@Mark: Да, конечно, вы можете явно перечислить каждый класс, на который наследуется ваш класс. Но я не знаю, как 'super()' работает внутри, поэтому, возможно, он делает некоторые сложные вещи для инициализации всего в правильном порядке. Я больше думал о том, что вы должны использовать метод 'super()' для вызова любого родителя, поскольку он гарантирует, что вызывается правильный метод, если класс наследуется от более чем одного класса. Вот почему я написал * safe *, поскольку я определенно уверен в этом с одним классом, но не с тем, как он ведет себя с большим количеством классов. –
Насколько я знаю, это невозможно в 2.5. Однако в версии 3.0 это было изменено, так что вы можете просто позвонить super().__init__()
.
В Python 3.0 super() можно вызвать без аргументов, чтобы сделать то же самое.
Это исправлено в Python 3. http://docs.python.org/py3k/library/functions.html#super
EDIT: Как указано Алексом, это приводит к бесконечной рекурсии, когда существует более чем один уровень наследования. Не используйте этот подход.
Да, «новые» классы стиля имеют атрибут __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
** неправильный **! Добавьте 'class E (D): pass' и попробуйте выполнить' e = E() ': вы получаете исключение с максимальной глубиной перегрева, потому что' D .__ init__' вызывает себя ('self .__ class__' is' E 'поэтому его' супер' '' 'D * -> бесконечная рекурсия). –
@Alex Martelli: Звучит разумно. –
Да, спасибо за это. Я тоже это заметил. – mhawke
- 1. Self = [super init]
- 2. Почему для списка <? super myclass>?
- 3. Как передать MyClass [] [] для MyClass **?
- 4. Назначение if (self == [super init])
- 5. Эффект 'myObj = [[[[MyClass alloc] init] autorelease] сохранить];'?
- 6. В чем разница между var t: MyClass = MyClass (o); и var t: MyClass = o как MyClass;
- 7. Вызов init в init, перед self = [super init]
- 8. «__weak MyClass * myWeakClass = self», используя myWeakClass VS, используя self
- 9. Невозможно преобразовать MyClass * в const MyClass
- 10. Почему alert ($ ('. MyClass'). HasClass ('myClass')); ложный?
- 11. MyClass :: class - получить строковое представление MyClass
- 12. функция MyClass() {...}; MyClass.prototype = MyClass; - считается вредным?
- 13. Назначить объект myClass объекту UIView и использовать селектора myClass (переменные)
- 14. Где разница между [MyClass alloc] и [[self class] alloc]?
- 15. Objective-c - что возвращает [super init]?
- 16. Objective-c: Вопросы о self = [super init]
- 17. Почему я сам - MyClass?
- 18. Java: Кастинг MyClass к списку <MyClass>
- 19. Сортировка <MyClass> в одном из пользователей MyClass?
- 20. Как построить контейнер MyClass, где может быть создан конструктор MyClass?
- 21. [self release], [self dealloc] или [super dealloc] в методах init?
- 22. Использование метода, возвращающего объект MyClass в MyClass, когда MySubClass расширяет MyClass
- 23. Почему в Objective-C мы используем self = [super init] вместо просто [super init]?
- 24. Преобразование MyClass <TDescendent> в MyClass <TAncestor>
- 25. разница между "MyClass & func1 (ничтожной)" и "MyClass * func2 (аннулируются)"
- 26. Разница между списком <MyClass> и MyClass []
- 27. «MyClass a (anotherInstance)»; быстрее, чем «MyClass a = anotherInstance»?
- 28. Почему self.class === MyClass возвращает false, а self.class == MyClass возвращает true?
- 29. error C2040: 'MyClass': 'void *' отличается в уровнях косвенности от 'MyClass'
- 30. int const MyClass :: MyMethod vs const int const MyClass :: MyMethod
Вы не одиноки: http://www.python.org/dev/peps/pep-3135/ –