如何在Python中实现抽象属性的setter



我有一个抽象类A,它有一个属性,我需要有一个变量listener/ssetter:

class A(object, metaclass=abc.ABCMeta):
@property
@abc.abstractmethod
def someData(self):
pass
# and several other functions which may or may not modify "someData"

字段someData的值正在一些派生类中分配。对于其他派生类,字段的值由派生类调用的A本身中的函数定义。

如果我尝试做这样的事情。。。

class A(object, metaclass=abc.ABCMeta):
@property
@abc.abstractmethod
def someData(self):
pass
@someData.setter
def someData(self, val):
self.someData = val

只有当CCD_ 4的值在CCD_。如果在其中一个派生类中为someData分配了值,则它不会调用setter函数。

如何为抽象属性实现setter(无论是在派生类中还是在抽象类中为属性赋值,都需要调用setter(?

使用子类不应覆盖的别名,该别名调用子类应覆盖的setter:

class A(object, metaclass=abc.ABCMeta):
@property
@abc.abstractmethod
def someData(self):
pass
@someData.setter
def _setSomeData(self, val):
self.setSomeData(val)
def setSomeData(self, val):
self._someData = val

由于self.someData是在运行时而不是在编译时确定的,因此只要子类只覆盖someData()方法,它就会始终用作"实际"setter。

通常使用此模式时,外部可见的变量名为someData,但内部名称为_someData。因为_someData不是一个@属性,所以它可以按正常方式获取和设置,而不会无限重复。然后,您还可以制作一个getter:

@someData.getter
def _getSomeData(self)
return self.getSomeData()
getSomeData(self):
return self._someData

最新更新