Считайте, что в Python у меня есть следующий код:
>>> class SuperClass(object):
def __init__(self, x):
self.x = x
>>> class SubClass(SuperClass):
def __init__(self, y):
self.y = y
# how do I initialize the SuperClass __init__ here?
Как мне инициализировать SuperClass __init__
в подклассе? Я следую руководству по Python, и оно не касается этого. Когда я искал в Google, я нашел несколько способов сделать. Каков стандартный способ справиться с этим?
__init__
.Начиная с python 3.5.2, вы можете использовать:
https://docs.python.org/3/library/functions.html#super
источник
Используйте
super
объект, чтобы убедиться, что вы получите следующий метод (как связанный метод) в порядке разрешения метода. В Python 2 вам нужно передать имя класса иself
super для поиска связанного__init__
метода:В Python 3 есть небольшая магия, которая делает аргументы
super
ненужными - и в качестве побочного преимущества это работает немного быстрее:Жесткое кодирование родителя, как показано ниже, не позволяет вам использовать кооперативное множественное наследование:
Обратите внимание, что
__init__
может быть только возвратNone
- он предназначен для изменения объекта на месте.Что-то
__new__
Есть другой способ инициализировать экземпляры - и это единственный способ для подклассов неизменяемых типов в Python. Так что это необходимо , если вы хотите подкласс
str
илиtuple
или другой неизменный объект.Вы можете подумать, что это метод класса, потому что он получает неявный аргумент класса. Но на самом деле это статический метод . Таким образом , вам нужно позвонить
__new__
сcls
явно.Обычно мы возвращаем экземпляр из
__new__
, поэтому, если вы это сделаете, вам также нужно вызвать свою базу__new__
viasuper
в своем базовом классе. Итак, если вы используете оба метода:Python 3 немного обошел стороной странности супервызовов, вызванных тем,
__new__
что он является статическим методом, но вам все равно нужно перейтиcls
к несвязанному__new__
методу:источник