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

如何在Python中实现抽象属性的setter?,python,abstract-class,setter,Python,Abstract Class,Setter,我有一个抽象类A,它有一个属性,我需要有一个变量侦听器/设置器: 类(对象,元类=abc.ABCMeta): @财产 @抽象方法 def someData(self): 通过 #以及其他一些可能修改或不修改“someData”的函数 字段someData的值正在某些派生类中赋值。对于其他派生类,字段值由派生类调用的A自身中的函数定义 如果我试着做这样的事 类(对象,元类=abc.ABCMeta): @财产 @抽象方法 def someData(self): 通过 @数据设置器 def some

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

类(对象,元类=abc.ABCMeta): @财产 @抽象方法 def someData(self): 通过 #以及其他一些可能修改或不修改“someData”的函数 字段
someData
的值正在某些派生类中赋值。对于其他派生类,字段值由派生类调用的
A
自身中的函数定义

如果我试着做这样的事

类(对象,元类=abc.ABCMeta): @财产 @抽象方法 def someData(self): 通过 @数据设置器 def someData(self,val): self.someData=val 。。。只有当
A
本身的某个函数中
someData
的值发生变化时,才会调用setter。如果
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
,但内部名称是
\u someData
。由于
\u someData
不是@属性,因此可以以正常方式获取和设置它,而不会无限重复。然后,您将继续制作一个getter:

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

  getSomeData(self):
    return self._someData

考虑到在Python中需要一个抽象类是多么罕见,你可能想考虑一下你真正需要的只是一个扩展和潜在覆盖的类。@ MichaelGuidry,我确信我的用例需要抽象类。所以这需要我显式重写派生类中的函数
someData()
?我不能直接给派生类中的
someData
赋值,就像对其他类属性赋值一样?@Shreya它会像任何其他方法一样工作-可以忽略并保持原样,或者如果需要,可以覆盖以获得不同的行为(如果子类没有显式重写它,那么它当然只使用超类的隐式实现)。虽然您可能还希望有两个版本的变量:
someData
属性和
\u someData
,但这是一个实例变量,它不是属性,但setter和getter使用它来保存它们返回的实际值。我将把它编辑到我的答案中。