gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:41:48 25 4
gpt4 key购买 nike

在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com