在 Python 3.6 中,假设我有一个抽象类 MyAbstractClass
from abc import ABC, abstractmethod
class MyAbstractClass(ABC):
@property
@abstractmethod
def myProperty(self):
pass
和一个类 MyInstantiatableClass
继承自它。那么如何在实例化此类的对象时写入属性 myProperty
呢?我希望能够设置和获取 myProperty
。以下不起作用。
from MyAbstractClass import MyAbstractClass
class MyInstantiatableClass(MyAbstractClass):
def __init__(self, desiredValueOfMyProperty):
????
@myProperty.setter
def myProperty(self, desiredValueOfMyProperty): # value coming from __init__
self._myProperty = desiredValueOfMyProperty
还有一个主要功能,比如说,
from MyInstantiatableClass import MyInstantiatableClass
def main():
MyInstantiatableClass(3) # 3 is the desiredValueOfMyProperty for this instantiation
MyInstantiatableClass(5) # 5 is the desiredValueOfMyProperty for this instantiation
最佳答案
这里好像有出入;将 @property
与 @abstractmethod
一起使用似乎不会强制从您的 abc 继承的类需要同时定义 setter
和 setter/getter
。使用这个:
@property
@abstractmethod
def myProperty(self):
pass
@myProperty.setter
@abstractmethod
def myProperty(self):
pass
然后只为类中的 getter
提供一个实现并允许实例化:
@property
def myProperty(self):
return self._myProperty
这是因为ABC的命名空间中只有一个名字(myProperty
)出现,在基类中重写时,只需要定义这一个名字即可。
有一种方法可以强制执行它。您可以创建单独的抽象方法并将它们直接传递给 property
:
class MyAbstractClass(ABC):
@abstractmethod
def getProperty(self):
pass
@abstractmethod
def setProperty(self, val):
pass
myAbstractProperty = property(getProperty, setProperty)
为这个 abc 提供一个实现现在需要 getter
和 setter
都有一个实现(这两个名称都被列为 abstractmethod
在 MyAbstractClass
命名空间中需要有一个实现):
class MyInstantiatableClass(MyAbstractClass):
def getProperty(self):
return self._Property
def setProperty(self, val):
self._Property = val
myAbstractProperty = property(getProperty, setProperty)
实现它们与任何旧属性完全相同。那里没有区别。
关于python - 如何在 Python 3.4+ 中写入抽象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44376851/