Все, что вам нужно, это иметь оператор if в классе Top
(родительский / базовый):
class Top:
def __init__(self, optional=None):
if optional is not None:
self.optional = optional
# (you don’t need an explicit return in __init__)
class Middle(Top):
def __init__(self, one, optional=None):
super().__init__(optional)
self.one = one
# this applies to Bottom class as well
Теперь не имеет значения, предоставляете ли вы эту опцию или нет. Допустим, вы вызываете Middle
без опциональных атрибутов, атрибут one
устанавливается так, как ожидается, и Top.__init__
вызывается с None
, потому что параметр по умолчанию в Middle
устанавливает его на это, если он не предоставлен. Так как ваш параметр по умолчанию None
во всех классах, наличие (или отсутствие присутствия) необязательного по существу выполняется.
Лично я даже не включил бы выражение if. Я бы установил атрибут как None
, чтобы позже в вашем коде, если вы пытаетесь получить доступ к obj.optional
, AttributeError
не вызывалось. Я считаю, что следует поддерживать атрибуты согласованными через подклассы, если они наследуются, чтобы любой, кто пытается использовать подклассы, ожидал, что все параметры, используемые в __init__
, будут использованы или установлены в качестве атрибутов через многочисленные super()
вызовы цепочки наследования и не будут потеряны ,