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

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

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.

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

1 Ответ

11 голосов
/ 28 апреля 2010

В 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 классом нового стиля , наследуя от объекта (или от некоторыхдругой новый стиль) класс.

...