Как правильно вызывать конструктор родительского класса, если дочерний класс перегружает установщик свойств, а родительский класс использует установщик в своем конструкторе?
Здесь простой пример, демонстрирующий вопрос; создать дочерний класс, который защищает устанавливаемый атрибут родительского класса.
class Parent:
"""Assign attribute in constructor - child fails
"""
def __init__(self, foo):
self.foo = foo
class Child(Parent):
"""Protect the settable attribute
"""
def __init__(self, foo):
super().__init__(foo=foo)
@property
def foo(self):
return super().foo
Попытка построить Child
вызывает AttributeError
, потому что во время выполнения тип self
, который передается в super().__init__
- это Child
, который защищает атрибут foo
. Если родительский класс переписывается следующим образом, построение Child
работает и защищает атрибут foo
по желанию.
class Parent:
"""Class with a settable attribute - child works
"""
def __init__(self, foo):
self._foo = foo
@property
def foo(self):
return self._foo
@foo.setter
def foo(self, value):
self._foo = value
Мой основной вопрос здесь не в том, как переписать Parent
, но существует ли способ, которым Child
должен быть написан иначе, чтобы вызов super().__init__
работал. Это, кажется, проявляется каждый раз, когда класс Parent
использует сеттер, который класс Child
хочет перезаписать.
Это кажется тесно связанным, но отличным: Перегрузка установщика свойств в Python