[英]How to write to an abstract property in Python 3.4+
在 Python 3.6 中,假設我有一個抽象 class MyAbstractClass
from abc import ABC, abstractmethod
class MyAbstractClass(ABC):
@property
@abstractmethod
def myProperty(self):
pass
和 class MyInstantiatableClass
繼承自它。 那么我如何在從這個 class 實例化 object 時寫入屬性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
還有一個主要的 function,比如說,
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
和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
都有一個實現(在MyAbstractClass
命名空間中列出為abstractmethod
的兩個名稱都需要有一個實現):
class MyInstantiatableClass(MyAbstractClass):
def getProperty(self):
return self._Property
def setProperty(self, val):
self._Property = val
myAbstractProperty = property(getProperty, setProperty)
實現它們與任何舊屬性完全相同。 那里沒有區別。
例如,您可以在Person abstract Person
中定義抽象的 getter、setter 和 deleter,在擴展Person
abstract class的Student
class中覆蓋它們,如下所示。 * @abstractmethod
必須是最里面的裝飾器否則會報錯:
from abc import ABC, abstractmethod
class Person(ABC):
@property
@abstractmethod # The innermost decorator
def name(self): # Abstract getter
pass
@name.setter
@abstractmethod # The innermost decorator
def name(self, name): # Abstract setter
pass
@name.deleter
@abstractmethod # The innermost decorator
def name(self): # Abstract deleter
pass
class Student(Person):
def __init__(self, name):
self._name = name
@property
def name(self): # Overrides abstract getter
return self._name
@name.setter
def name(self, name): # Overrides abstract setter
self._name = name
@name.deleter
def name(self): # Overrides abstract deleter
del self._name
然后,您可以實例化Student
class並調用 getter、setter 和 deleter,如下所示:
obj = Student("John") # Instantiates "Student" class
print(obj.name) # Getter
obj.name = "Tom" # Setter
print(obj.name) # Getter
del obj.name # Deleter
print(hasattr(obj, "name"))
Output:
John
Tom
False
你可以看到我的答案,它解釋了更多關於abstract property 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.