1

我正在阅读这篇文章,有些事情没有得到清除

https://stackoverflow.com/a/14787522/1890488

他使用此代码

class O4(O3):
    @property # this decorator makes this instancevar into a data descriptor
    def var(self):
        return "Data descriptors (such as properties) are high priority"

    @var.setter # I'll let O3's constructor set a value in __dict__
    def var(self, value):
        self.__dict__["var"]  = value # but I know it will be ignored

他说@property 将任何实例变量转换为数据描述符。

  1. 现在这是否意味着它会自动定义__get__,__set__并且__del__对于那个变量

或 @property 仅相当于__get__

我不明白

  1. 是否还有更多将实例变量转换为数据描述符的装饰器

  2. @var.setter 的功能是什么。那也是数据描述符部分

4

2 回答 2

1

@property调用内置函数,property()您应该查阅文档以获取详细信息。

property只有一个强制参数,最左边的“getter”。其他的是setterdeleter

使用带有@前缀的装饰器只是语法糖。如果您希望可以property以更传统的(如果 unpythonic)方式调用:

def var_get(self):
    return "Data descriptors (such as properties) are high priority"

def var_set(self, value):
    self.__dict__["var"]  = value 

var = property(var_get, var_set)
于 2013-02-11T09:05:01.650 回答
0

如果您查看系统上的属性装饰器的代码,您会发现它需要三个参数:

  • fget:获取变量的函数;
  • fset: 设置变量的函数;
  • fdel: 删除变量的函数。

正如您通常使用装饰器装饰单个函数一样,您通常只需定义 getter:

@property
def my_var(self):
    return self._my_var

如果您还想声明一个 setter,您可以使用新的“属性”来包含一个 setter,方法是.setter

@my_var.setter
def my_var(self, value):
    self._my_var = value

两者结合相当于调用my_var = property(get_my_var, set_my_var)

于 2013-02-11T09:01:19.703 回答