【发布时间】:2020-10-07 11:20:33
【问题描述】:
我对使用属性装饰器时属性变量在我的类中的行为方式感到困惑。
看这个例子:
class Example:
def __init__(self, x):
self.x = x
@property
def x(self):
return self.__x
@x.setter
def x(self, x):
self.__x = x
这很好用,但是怎么做呢? setter属性内的变量(self.__x)还没有在构造函数中“定义”,那怎么赋值呢?
其他东西也可以,例如,采用上面定义的相同类并为其添加新的成员函数:
def set_val_x(self):
self.__x = 8765
同样,使用这个函数实际上是有效的,类似于 property.setter(但它没有使用属性装饰器)。
【问题讨论】:
-
Python 中没有要求必须在构造函数中初始化对象的属性。
-
Python 允许您根据需要创建任意属性(除非您使用例如
__slots__)。 -
属性是一个 class 属性,当通过实例调用时具有特殊行为。
Example.x的类属性在Example.__init__运行时已经很好地定义了。
标签: python oop properties decorator