簡體   English   中英

為什么在Python中不能反轉getter / setter屬性?

[英]Why can't the getter/setter properties be reversed in Python?

我試圖了解屬性裝飾器在Python中的工作方式。 下面的代碼失敗,因為getter / setter裝飾器的順序錯誤,因此(我假設)尚未定義email屬性對象。

class ReverseProperties:
    def __init__(self):
        self._email = None

    @email.setter
    def email(self, value):
        self._email = value

    @property
    def email(self):
        return self._email

我知道上面的裝飾器與此等效:

def get_email(self):
    return self._email

email = property(get_email)

def set_email(self, value):
    self._email = value

email = email.setter(set_email)

但是,在使用屬性裝飾器時,將email存儲在哪里,以便我們可以使用@email.setter裝飾器? 使用這些裝飾器時,類中到底發生了什么?

函數是python中的第一類,因此將它們像其他任何值一樣考慮。 屬性裝飾器對此進行了總結,但它仍然只是一個對象。 因此,它本質上存儲在email屬性中。 從類級別(即未綁定到實例)看時,電子郵件是具有setter屬性的對象。

正如您(在大多數情況下)在示例中所顯示的那樣,屬性包裝了一個方法。 當使用裝飾器形式時,它大致等同於:

def email(self):
    return self._email

email = property(email)

def set_email(self, value):
    self._email = value

email = email.setter(set_email)

從技術上講,此無效Python的含義更多:

email = property(def(self): return self._email)
email = email.setter(def(self, value): self._email = value)

分配給變量的名稱是從def語句獲取的名稱。 包裝函數/方法的函數是@的函數。 最后,您可以將其視為首先“訪問”外部包裝功能,或者將功能定義在包裝之前不保存為名稱,這就是為什么以下內容有效的原因(即,為什么電子郵件沒有變回功能)在用作email.setter之前):

@email.setter
def email(self, value):
    self._email = value

屬性是一個簡單的對象,具有一個get方法,一個set方法和一個del方法。

裝飾器語法只是定義屬性的一種簡便方法,但是您首先必須創建屬性本身。 所以

@property
def email(self):
    ...

定義屬性並設置get方法。

@email.setter
def email(self, value):
    ...

接收屬性email並設置設置方法。

原則上您可以扭轉這種情況,但是然后您必須單獨執行定義步驟:

class ReverseProperties:
    def __init__(self):
        self._email = None

    email = property() # define the property

    @email.setter
    def email(self, value):
        self._email = value

    @email.getter
    def email(self):
        return self._email

暫無
暫無

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

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