繁体   English   中英

如何在 Python 中实现抽象属性的设置器?

[英]How can I implement a setter for an abstract property in Python?

我有一个抽象的 class A它有一个属性,我需要一个变量监听器/设置器:

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 调用。

如果我尝试做这样的事情,...

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

  @someData.setter
  def someData(self, val):
    self.someData = val

...只有当 someData 的值在A本身的某些someData内发生变化时,才会调用设置器。 如果someData在派生类之一中被赋值,它不会调用设置器 function。

如何为抽象属性实现设置器(无论是在派生类之一还是在抽象类中为属性分配值,我都需要调用设置器)?

使用子类不应覆盖的别名,它调用子类覆盖的设置器:

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()方法,它将始终用作“实际”设置器。

通常在使用这种模式时,外部可见的变量名称是someData ,但内部名称是_someData 因为_someData不是@property,所以可以正常方式获取和设置,不会无限重复。 然后你会继续做一个吸气剂:

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

  getSomeData(self):
    return self._someData

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM