python - 如何在 Python 3.4+ 中写入抽象属性

标签 python python-3.x inheritance abstract-class

在 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)出现,在基类中重写时,只需要定义这一个名字即可。

p>

有一种方法可以强制执行它。您可以创建单独的抽象方法并将它们直接传递给 property:

class MyAbstractClass(ABC):

    @abstractmethod
    def getProperty(self):
        pass

    @abstractmethod
    def setProperty(self, val):
        pass

    myAbstractProperty = property(getProperty, setProperty)

为这个 abc 提供一个实现现在需要 gettersetter 都有一个实现(这两个名称都被列为 abstractmethodMyAbstractClass 命名空间中需要有一个实现):

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/

相关文章:

python - 数据框行与列交互的 Lambda

python - 如何控制 fbprophet 的输出?

C++ 虚拟方法 : access rights, friends & Co

python - python列表理解中的分配

python - 当我们传递魔术模拟对象时,python 中的 List 方法返回空列表

c++ - 使用派生类的数据成员初始化基类

java - java中的静态方法继承

python - 如何在Windows 7 64位上正确安装Python?

python - 比较两个 .xlsx 工作簿并将差异打印到 3. python 工作簿中

python - 如何在汇编器中使用 IF 伪操作处理前向引用