当我了解python的“property”时,令我惊讶的是,输出结果与应该是的代码说明如下:
class HideX(object):
def __init__(self,x):
self.x = x
def get_x(self):
return ~self.__x
def set_x(self,x):
assert isinstance(x,int),\
'"x" must be an integer!'
self.__x = ~x
x = property(get_x, set_x)
inst = HideX(20)
#inst.x = 20#
当它执行inst = HideX(20)
时。我认为它将调用__init__(self,x)
,因此指令self.x = x
将被执行。问题发生了。我认为它不会调用x = property(get_x, set_x)
,因为self.x
在类的主体中(它在类的顶部)
只有在类外(如#….所示)我们才能访问x = property(get_x, set_x)
我错了吗?你能理解我的意思吗?在
索夫德:
经过反复的测试,我惊奇地发现当我们执行inst = HideX(20)
时,代码x = property(get_x, set_x)
将首先调用,而不是'init(self,x)'。完全出乎我的意料!!!(在java中,当我们创建一个实例时,类的init()将首先被调用,我想,也许我错了)
(1)你能给我解释一下这种内在机制吗?我是新手,谢谢你的耐心。在
以下代码是我复制的段:
^{pr2}$但它不能正常运行 错误代码是:
File "<string>", line 21, in <module>
File "<string>", line 4, in __init__
AttributeError: can't set attribute
(2)这本书错了吗??当我删除@property并添加代码'x=property(**x())'时,它就起作用了!!!在
你能给我解释一下原因吗?非常感谢
对于第一个问题,答案很简单,x是类的一个属性(不是类的对象/实例),它将在类被定义时(而不是在创建其对象时)进行计算。在
举个例子来说明这一点-
如您所见,
y
的值是在定义类时计算的,它与类中的所有函数都是一样的,它们在类被定义时被定义,但是它们只在函数被调用时才被计算。在另外,使用@property与
^{pr2}$property(**x())
不同,当您使用后者时,**x()
解析为-然后这些位置参数用于为属性}设置},而{}注释用于定义属性x的getter
getter
和{getter
和{相关问题 更多 >
编程相关推荐