【问题标题】:How does property decorator work internally using syntactic sugar(@) in python?属性装饰器如何在 python 中使用语法糖(@)在内部工作?
【发布时间】:2020-11-07 03:45:45
【问题描述】:

我知道我的问题似乎与其他人非常相似。但实际上并非如此,我搜索了很多并找不到我的答案。

据我们所知:

@mydecorator
def myfn():
    pass

被(确切地说?)翻译成:

def myfn():
    pass
myfn = mydecorator(myfn)

考虑以下类:

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

如果我们想把这些翻译成函数+赋值语句,对于getter是没有问题的:

def language(self):
    return self._language
language = property(language)

但是二传手呢? :

def language(self, value):
    self._language = value
language = language.setter(language)

我做了我以前做过的事,但那是行不通的。 在上一阶段(getter)之后,标签“语言”指的是属性对象。 现在它被重新分配给一个函数(函数首先出现)!所以这个 language.setter 不再起作用了,它不再是一个属性了。

我想当我们使用 @ 语法时可能会有一个额外的步骤。如果是,那是什么?我们可以说它们彼此大致相似吗?

如果不是,例如当我们将装饰器与属性对象一起使用时,它们的行为不仅仅是转换为函数+赋值语句?

【问题讨论】:

    标签: python properties decorator


    【解决方案1】:

    不同之处在于您问自己是否与(exactly?) 相同。

    PEP 318 迅速提及:

    当前语法

    函数装饰器的当前语法为 在 Python 2.4a2 中实现的是:

    @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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-31
      • 2021-12-15
      • 2012-04-15
      • 2013-06-12
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 2010-12-27
      相关资源
      最近更新 更多