无法理解python中的实例变量描述符

时间:2013-02-11 08:52:24

标签: python

我正在阅读这篇文章,很少有事情没有被清除

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__以获取该可变性
  2. 或@property仅相当于__get__

    我没有得到它

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

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

2 个答案:

答案 0 :(得分:1)

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

property只有一个必需参数,最左边是“getter”。其他人是setterdeleter

使用带有@前缀的装饰器只是语法糖。如果您愿意,可以用更传统的(如果是非语音的)方式拨打property

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)

答案 1 :(得分:0)

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

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

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

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

如果您还要声明一个二传手,您可以通过.setter使用新的“属性”来包含一个二传手:

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

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