Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Access属性对象(用于替换setter方法)_Python_Properties - Fatal编程技术网

Python Access属性对象(用于替换setter方法)

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

考虑以下代码取自

正如在许多其他问题中已经解释的那样,这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
而不是
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 ....>