Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Передача параметра конструктору базового класса или использование переменной экземпляра?

Автор вопроса: deamonОтветов: 1

Все классы, производные от определенного базового класса, должны определять атрибут под названием "путь". В смысле утиной печати я мог полагаться на определение в подклассах:

class Base:
    pass # no "path" variable here

def Sub(Base):
    def __init__(self):
        self.path = "something/"

Другой возможностью было бы использование конструктора базового класса:

class Base:
    def __init__(self, path):
        self.path = path

def Sub(Base):
    def __init__(self):
        super().__init__("something/")

Я использую Python 3.1.

Что бы вы предпочли и почему? Есть ли способ лучше?

pythonoopparametersconstructor

Ответы

Ответ 1 · рейтинг 12 · Michael Aaron Safyan

В Python 3.0+:
я бы использовал параметр конструктора базового класса, как во втором примере. Поскольку это заставляет классы, производные от Base, предоставлять необходимое свойство пути, которое документирует тот факт, что класс имеет такое свойство и что производные классы должны его предоставлять. Без этого вы бы полагались на то, что это указано (и прочитано) где-то в строках документации вашего класса, хотя, безусловно, полезно также указать в строке документации, что означает конкретное свойство.

В Python 2.6+:
я бы не использовал ничего из вышеперечисленного; вместо этого я бы использовал:

class Base(object):
    def __init__(self,path):
        self.path=path;

class Sub(Base):
    def __init__(self):
       Base.__init__(self,"something/")

Другими словами, мне бы потребовался такой параметр в конструкторе базового класса, потому что он документирует тот факт, что все такие типы будут иметь/использовать/нуждаться в этом конкретном параметре и что этот параметр необходимо предоставить. Однако я бы не стал использовать super(), так как super несколько хрупок и опасен в Python, и я бы также сделал Base классом нового стиля, наследуя от объекта ( или из какого-то другого класса нового стиля).

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы