簡體   English   中英

在 python 中,屬性裝飾器如何在內部使用語法糖(@)工作?

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

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