Python Access属性对象(用于替换setter方法)
考虑以下代码取自 正如在许多其他问题中已经解释的那样,这100%相当于Python Access属性对象(用于替换setter方法),python,properties,Python,Properties,考虑以下代码取自 正如在许多其他问题中已经解释的那样,这100%相当于 class test: _x = 10 @property def x(self): return self._x @x.setter def x(self, val): self._x = val 我想访问属性x(而不是\u x中的int),以更改x.setter的值 但是,执行type(test().x)返回int而不是propert
class test:
_x = 10
@property
def x(self):
return self._x
@x.setter
def x(self, val):
self._x = val
我想访问属性x
(而不是\u x
中的int
),以更改x.setter
的值
但是,执行type(test().x)
返回int
而不是property
,表明test().x
返回的是\ux
而不是属性x
。实际上,尝试访问test().x.setter
返回一个AttributeError:'int'对象没有属性“setter”
我知道99.9%的情况下,当某人执行test().x
时,他希望访问与属性x
相关的值。这正是属性的用途
然而,当我想访问属性
对象而不是getter
返回的值时,有0.01%的时候我该怎么办?x
是一个类属性,它的\uu get\uuu
方法在类的实例上调用时接收对该对象的引用。您需要首先获取对类的引用,然后才能在不调用getter的情况下获取实际的属性
对象
>>> t = test()
>>> t.x
10
>>> type(t).x
<property object at ....>
>t=test()
>>>t.x
10
>>>类型(t).x
可能不是,因为修饰符是在读取期间应用的,在运行期间不会保留。它是类型(test()).x
;获取实例的基础类型,然后获取属性
-值属性。但对于第一个不使用装饰器的示例,情况也是如此。此外,如果我正确理解了属性
,@x.setter
正在使用属性
对象x的setter
方法作为以下方法的装饰器。因此,至少在该上下文中,x
不是getter
返回的值,而是属性本身。关键是属性确实是类属性。非常感谢,并不是每件事都清楚得多。PS:尝试你的答案,我刚刚发现“属性”对象属性“setter”是只读的。这使得我访问属性的理由毫无意义,但这是另一个主题…它是只读的,但在第一个示例中,x.setter
的工作方式是使用给定的setter返回一个新的属性
实例。这就是为什么修饰方法的名称需要与现有属性相同:以便修饰器将新属性指定给已在使用的名称。
>>> t = test()
>>> t.x
10
>>> type(t).x
<property object at ....>