Преимущества объявления подклассов с помощью конструктора базовых классов в Python - PullRequest
0 голосов
/ 27 марта 2019

Есть ли преимущества объявления и инициализации подкласса с помощью метода конструктора базового класса с параметрами:

class BaseClass(object):
  def __init__(self, a, b):
    self.a = a
    self.b = b

class SubClass(BaseClass):
  def __init__(self, a, b, c, d):
    BaseClass.__init__(self, a, b)
    # or super().
    self.c = c
    self.d = d

newSubClassInstance = SubClass("one", "two", "three", "four")

Более не использует параметры вообще и просто инициализируется следующим образом:

class BaseClass(object):
  def __init__(self):
    self.a = " "
    self.b = " "

class SubClass(BaseClass):
  def __init__(self):
    self.c = " "
    self.d = " "

newSubClassInstance = SubClass()
newSubClassInstance.a = "one"
newSubClassInstance.b = "two"
newSubClassInstance.c = "three"
newSubClassInstance.d = "four"

Или все зависит от того, как можно написать и использовать этот код в программе? Я в основном спрашиваю об ожиданиях; будет ли один лучше другого, если его попросят создать эту конкретную задачу в Python, например?

1 Ответ

2 голосов
/ 27 марта 2019

Вы должны определенно создать и настроить класс в методе __init__. Когда класс (создан и) инициализирован, он должен, по возможности, быть готовым к использованию. Это то, что можно ожидать от класса.

В некоторых ситуациях, например при попытке имитировать неизменяемые значения никогда не должны обновляться после вызова __init__(). Обновление также выполняется после инициализации, поскольку обновление может потребовать других изменений. Подумайте о графическом интерфейсе, где одним из входных данных является размер рисуемого окна. Если он установлен после первого появления окна, его необходимо перерисовать.

Кроме того, ваш второй подход плох по-другому; у вас даже нет self.a и self.b после вызова __init__(), как вы никогда не звоните BaseClass.__init__(). Это всегда следует делать при наследовании и переопределении __init__().

Вам также следует подумать о замене явного вызова на BaseClass вызовом super() (как вы написали в качестве комментария), так как это будет лучше обрабатывать множественное наследование.

...