簡體   English   中英

@property 裝飾器 function 是吸氣劑嗎?

[英]does the @property decorator function as a getter?

我是 python 的新手,我正在嘗試了解“getter”的用法。 它的用例對我來說並不明顯。 如果我在一個方法上使用一個屬性裝飾器並且我能夠返回一個特定的值,我到底會用'getter'來做什么。

class Person:
    def __init__(self,name, age):
        self._name = name
        self._age = age
    
    @property
    def age(self):
        return self._age      

    
    @age.setter
    def age(self,new_age):
        if isinstance(new_age,int) and 18 < new_age < 120:
            self._age = new_age

@property裝飾器在 Python class 中的給定字段上添加默認 getter,在訪問屬性時觸發 function 調用。

@property 裝飾器將 age() 方法轉換為具有相同名稱的只讀屬性的“getter”。 如果想要一個“setter”,那么就像你在問題中所做的那樣添加@age.setter

p = Person("John", 22)
print(p.age)

Output:

22

property類型在實例化時最多可以占用 4 個單獨的 arguments(一個 getter、一個 setter、一個 deleter 和一個 doc 字符串)。 第一個參數是 function,將用作 getter。 第二個是將用作設置器的 function。 你可以把你的 class 寫成

class Person:
    def __init__(self,name, age):
        self._name = name
        self._age = age
    
    def _age_getter(self):
        return self._age

    def _age_setter(self, new_age):
        ...

    age = property(_age_getter, _age_setter)

這寫起來很麻煩,所以property對象有很多方法來逐個構建屬性。 使用property作為簡單的裝飾器創建一個只讀屬性,並將裝飾后的 function 作為 getter。

# Equivalent to
#    def age(self):
#        return self._age
#    age = property(age)
@property
def age(self):
    return self._age

age.setterproperty實例的一種方法,它創建一個屬性,該屬性本質上是age的副本,但其參數用於替換原始屬性具有的任何設置器。 (裝飾器語法是所有涉及的方法必須具有相同名稱的原因,因此我們不斷用新的、擴充的屬性替換原始屬性,而不是用不同的名稱定義多個相似的屬性。)

@age.setter
def age(self, new_age):
    ...

對此進行脫糖需要使用臨時變量,以避免過早丟失舊的age值。

old_property = age
def age(self, new_age):
    ...
age = old_property.setter(age)

一種愚蠢但合法的定義屬性的方法利用了這樣一個事實,即可以在沒有arguments 的情況下定義property ,並且有一個getter方法也可以用作裝飾器。 (不過,我認為我從未見過它在野外使用過。)

class Person:
    def __init__(self, name, age):
        ...

    age = property()

    @age.getter
    def age(self):
        ...

    @age.setter
    def age(self, new_age):
        ...

請注意,我們使用gettersetter和(和deleter )方法的順序無關緊要。 傳統的順序來自property期望其位置 arguments 被提供的順序,以及新屬性實際上總是通過直接裝飾 getter 而不是在屬性創建后添加 getter 來定義的事實。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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