簡體   English   中英

如何寫入 Python 3.4+ 中的抽象屬性

[英]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繼承類需要定義兩個settergetter 使用這個:

@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提供一個實現需要gettersetter都有一個實現(在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 classStudent 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM