我正在阅读这篇文章,很少有事情没有被清除
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将任何实例变量转换为数据描述符。
__get__
,__set__
和__del__
以获取该可变性或@property仅相当于__get__
我没有得到它
是否还有将实例变量转换为数据描述符的装饰器
@ var.setter的功能是什么。那也是数据描述符部分
答案 0 :(得分:1)
@property
调用property()
内置版,您应该查阅文档以获取详细信息。
property
只有一个必需参数,最左边是“getter”。其他人是setter
和deleter
。
使用带有@
前缀的装饰器只是语法糖。如果您愿意,可以用更传统的(如果是非语音的)方式拨打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)
。