如何在python3.4中写入抽象属性+

2024-06-16 12:53:22 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python3.6中,假设我有一个抽象类MyAbstractClass

from abc import ABC, abstractmethod

class MyAbstractClass(ABC):

    @property
    @abstractmethod
    def myProperty(self):
        pass

一个类MyInstantiatableClass从中继承。那么如何在实例化这个类中的对象时写入属性myProperty?我希望能够同时设置和获取myProperty。下面不起作用。在

^{pr2}$

还有一个主要功能,比如说

from MyInstantiatableClass import MyInstantiatableClass

def main():
    MyInstantiatableClass(3) # 3 is the desiredValueOfMyProperty for this instantiation
    MyInstantiatableClass(5) # 5 is the desiredValueOfMyProperty for this instantiation

Tags: thefromimportforisdef抽象类this
1条回答
网友
1楼 · 发布于 2024-06-16 12:53:22

这里似乎有一个差异;使用@property@abstractmethod似乎并不强制要求从abc继承的类同时定义setter和{}。使用这个:

@property
@abstractmethod
def myProperty(self):
    pass

@myProperty.setter
@abstractmethod
def myProperty(self):
    pass

{and只允许在类中实例化},然后为类提供实例:

^{2}$

这是因为只有一个名称(myProperty)出现在ABC的名称空间中,当您在基类中重写时,只需要定义这一个名称。在

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

class MyAbstractClass(ABC):

    @abstractmethod
    def getProperty(self):
        pass

    @abstractmethod
    def setProperty(self, val):
        pass

    myAbstractProperty = property(getProperty, setProperty)

为这个abc提供一个实现现在需要getter和{}都有一个实现(在MyAbstractClass命名空间中被列为abstractmethods的两个名称都需要有一个实现):

class MyInstantiatableClass(MyAbstractClass):

    def getProperty(self):
        return self._Property

    def setProperty(self, val):
        self._Property = val
    myAbstractProperty = property(getProperty, setProperty)

实现它们与任何旧属性完全相同。这没什么区别。在

相关问题 更多 >