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