Как дочерний класс должен вызывать родительский конструктор, если он перегрузил установщик свойств? - PullRequest
0 голосов
/ 07 августа 2020

Как правильно вызывать конструктор родительского класса, если дочерний класс перегружает установщик свойств, а родительский класс использует установщик в своем конструкторе?

Здесь простой пример, демонстрирующий вопрос; создать дочерний класс, который защищает устанавливаемый атрибут родительского класса.

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

...