【发布时间】:2023-03-14 05:16:02
【问题描述】:
当我学习python的“属性”时,令我惊讶的是,输出与预期的不一样。代码如下所示:
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)你能解释一下内在机制吗?我是新手,感谢您的耐心等待。
下面的代码是我复制的段:
class HideXX(object):
def __init__(self, x):
self.x = x
@property
def x():
def fget(self):
return ~self.__x
def fset(self,x):
assert isinstance(x,int),\
'"x" must be an integer!'
self.__x = ~x
return locals()
#x = property(**x())
inst = HideXX(1)
但无法正常运行 错误代码是:
File "<string>", line 21, in <module>
File "<string>", line 4, in __init__
AttributeError: can't set attribute
(2)书错了吗??当我删除 @property 并添加代码 'x = property(**x())' 它有效!!!
你能给我解释一下原因吗?非常感谢
【问题讨论】:
标签: python properties decorator init