Ответы вполне хороши, но есть примечание, которое я считаю важным сделать.Возьмите фрагмент (в классе MITPerson
):
def __init__(self, familyName, firstName):
Person.__init__(self, familyName, firstName)
Этот код совершенно бесполезен и избыточен.Когда подклассу не нужно переопределять что-либо в реализации метода своего суперкласса, для подкласса совершенно бесполезно выглядеть, как будто он "переопределяет" этот метод ... и затем просто делегировать всю работу, безлюбые изменения в суперклассе в любом случае.
Код, который не имеет абсолютно никакой цели, никогда не будет иметь никакого значения (кроме незначительного замедления всей системы), и поэтому может быть удален без какого-либо вреда, должен быть удаленным: зачем это вообще ?!Любой код, который присутствует в вашей программе, но совсем не полезен, неизбежно ухудшает качество вашей программы: такой бесполезный «балласт» разбавляет полезный рабочий код, делая вашу программу труднее читать, поддерживать, отлаживать и т. Д.
Большинство людей, кажется, понимают это интуитивно в большинстве ситуаций (поэтому вы не видите большого количества кода, вокруг которого "фальсифицирует-переопределяет" большинство методов, но в теле метода просто указывается реализация суперкласса) за исключением для __init__
- где многие по какой-то причине, кажется, имеют умственную слепую зону и просто не могут видеть, что применяется точно такое же правило, как и для других методов.Это слепое пятно может возникнуть из-за того, что вы знакомы с другими, совершенно другими языками, где правило не применяется к конструктору класса , плюс ошибочное представление, что __init__
воспринимается как конструктор, в действительности его нет (это инициализатор ).
Итак, подведем итог: подкласс должен определять __init__
тогда и только тогда, когда ему нужно сделать что-то еще до, или после, или оба до ипосле этого, собственный инициализатор суперкласса (очень редко он может захотеть сделать что-то вместо , то есть не делегировать инициализатору суперкласса вообще, но это вряд ли когда-либо будет хорошей практикой).Если тело __init__
подкласса имеет просто вызов к __init__
суперкласса с точно такими же параметрами в том же порядке, исключите из своего кода __init__
подкласса (как вы это сделали бы длялюбой другой аналогично-избыточный метод).