Я читал «Погружение в Python» и в главе о классах приводится такой пример:
class FileInfo(UserDict):
"store file metadata"
def __init__(self, filename=None):
UserDict.__init__(self)
self["name"] = filename
Затем автор говорит, что если вы хотите переопределить __init__
метод, вы должны явно вызвать родительский элемент __init__
с правильными параметрами.
- Что, если у этого
FileInfo
класса было несколько классов-предков?- Должен ли я явно вызывать все
__init__
методы классов-предков ?
- Должен ли я явно вызывать все
- Кроме того, должен ли я сделать это с любым другим методом, который я хочу переопределить?
python
overriding
superclass
liewl
источник
источник
Ответы:
Книга немного устарела в отношении вызова подкласса-суперкласса. Это также немного устарело в отношении создания подклассов встроенных классов.
Сейчас это выглядит так:
Обратите внимание на следующее:
Мы можем непосредственно подкласс встроенных классов, как
dict
,list
,tuple
и т.д.В
super
функции ручки отслеживания суперкласс этого класса и вызова функций в них соответствующим образом .источник
В каждом классе, от которого вам нужно унаследоваться, вы можете запустить цикл каждого класса, который нуждается в init'd при инициации дочернего класса ... пример, который можно скопировать, может быть лучше понят ...
источник
Child.__init__
необходим. Когда я убираю его из примера, ребенок все равно печатает «Бабушка». Разве дедушка и бабушка не обрабатываютсяParent
классом?На самом деле вам не нужно вызывать
__init__
методы базового класса (ов), но обычно вы хотите это сделать, потому что базовые классы будут выполнять некоторые важные инициализации, которые необходимы для работы методов остальных классов.Для других методов это зависит от ваших намерений. Если вы просто хотите добавить что-то к поведению базовых классов, вам нужно будет вызвать метод базовых классов в дополнение к своему собственному коду. Если вы хотите коренным образом изменить поведение, вы можете не вызывать метод базового класса и реализовать все функции непосредственно в производном классе.
источник
Если класс FileInfo имеет более одного класса-предка, вам обязательно следует вызвать все их функции __init __ (). Вы также должны сделать то же самое для функции __del __ (), которая является деструктором.
источник
Да, вы должны вызывать
__init__
каждый родительский класс. То же самое касается функций, если вы переопределяете функцию, которая существует в обоих родителях.источник