[英]How does property decorator work internally using syntactic sugar(@) in python?
我知道我的問題似乎與其他人非常相似。 但事實並非如此,我已經搜索了很多但找不到我的答案。
據我們所知:
@mydecorator
def myfn():
pass
是(確切地?)翻譯成:
def myfn():
pass
myfn = mydecorator(myfn)
考慮以下 class:
class C:
def __init__(self, language):
self._language = language
@property
def language(self):
return self._language
@language.setter
def language(self, value):
self._language = value
如果我們想將這些翻譯成 function + 賦值語句,對於 getter 來說沒有問題:
def language(self):
return self._language
language = property(language)
但是二傳手呢? :
def language(self, value):
self._language = value
language = language.setter(language)
我做了我以前做過的事情,但那是行不通的。 在前一階段(getter)之后,label 'language' 引用了屬性 object。現在它被重新分配給一個函數(函數優先)。 所以這個 language.setter 不會工作它不再是一個屬性。
我想當我們使用 @ 語法時可能會有一個額外的步驟。 如果是,那是什么? 我們可以說它們彼此大致相似嗎?
如果不是,例如當我們將裝飾器與屬性對象一起使用時,它們的行為不僅僅是轉換為 function + 賦值語句?
不同之處在於您問自己是否(exactly?)
相同。
PEP 318快速提到它:
當前語法
在 Python 2.4a2 中實現的 function 裝飾器的當前語法是:
@dec2
@dec1
def func(arg1, arg2, ...):
pass
這相當於:
def func(arg1, arg2, ...):
pass
func = dec2(dec1(func))
沒有對變量 func 的中間賦值。 (強調我的)
所以,這就是為什么當你使用@decorator
語法時一切正常。
您可以使用不同的名稱使其工作:
class C:
def __init__(self, language):
self._language = language
def language(self):
return self._language
language = property(language)
def dummy_temporary_name(self, value):
self._language = value
language = language.setter(dummy_temporary_name)
c = C('fr')
print(c.language)
c.language = 'de'
print(c.language)
# fr
# de
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.