Я пробовал этот код в python 3.6
from abc import ABC, abstractmethod
class A(ABC):
@property
@abstractmethod
def prop1(self):
pass
@prop1.setter
@abstractmethod
def prop1(self, val):
pass
class B(A):
def __init__(self, val=None):
self._prop = val
@A.prop1.setter
def prop1(self, val):
if val == "something":
self._prop = val
else:
self._prop = "nothing"
@A.prop1.getter
def prop1(self):
return self._prop
def do_something(self):
self.prop1 = "blah"
Получаю ошибку TypeError: Can't instantiate abstract class B with abstract methods prop1
. Но если я удалю @A
из переопределенного геттера таким образом, код будет работать нормально.
@prop1.getter
def prop1(self):
return self._prop
Более того, не имеет значения, находится ли геттер выше или ниже сеттера. Только самому первому, кажется, нужен @A.
. Почему так?