我正在尝试让抽象属性发挥作用,在下游类中强制执行属性 getter 和 setter 定义。
from abc import ABC, abstractmethod
class BaseABC(ABC):
@property
@abstractmethod
def x(self):
pass
@x.setter
@abstractmethod
def x(self, value):
pass
class MyClass(BaseABC):
def __init__(self, value):
self._x = value
@property
def x(self):
return self._x
# @x.setter
# def x(self, val):
# self._x = val
obj = MyClass(10)
print(obj.x)
obj.x = 20
print(obj.x)
阅读完文档后,似乎表明上面的内容应该在构建类时触发
TypeError
,但只有在设置属性后才会触发AttributeError
。
为什么通过
BaseABC
在 @abstractmethod
中显式定义的缺席设置器不会触发预期的 TypeError?
如何确保子类中需要一名 setter?
MyClass
中,
property
使用给定的 getter 和 nosetter 创建一个全新的属性;它并不简单地覆盖继承属性的 getter。 要“继承”抽象设置器,请使用
class MyClass(BaseABC):
@BaseABC.x.getter
def x(self):
return self._x
使用
BaseABC.x
的新属性“覆盖”
BaseABC.x.setter
,但使用新的给定 getter。要使 MyClass
可实例化,您仍然需要使用 x.setter
提供具体的 setter。