[英]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.