class P:
def __init__(self,x):
self.x = x
@property
def x(self):
return self.__x
@x.setter
def x(self, x):
if x < 0:
self.__x = 0
elif x > 1000:
self.__x = 1000
else:
self.__x = x我正在努力学习‘getter’和'setters‘方法。当我使用以下输入创建一个实例时:
p1 = P(1001)
print(p1.x)
p1.x = -12
print(p1.x)作为产出,我得到:
1001
-12我不知道为什么我得到1001和-12而不是1000和0。
发布于 2018-03-23 14:37:40
您真正的问题是,您将Python2.x与旧样式类结合使用。如图所示,您的代码在Python3.x上将如您所期望的那样工作(当然,除了破损的缩进之外)。如果您通过显式地从P继承object (例如,将它声明为class P(object):),从而使它成为一个新的样式类,那么它也将在Python2.x上工作。
在一个旧风格的类中,问题是您的setter和getter方法都名为x,并且都在同一个命名空间中竞争条目。
当您有这样的代码时:
@x.setter
def x(self, x):
...所发生的情况是,使用您指定的代码创建一个新的函数对象(令人困惑地命名为x),然后调用x.setter(x_function_object),任何x.setter返回(将是定义了__get__和__set__的描述符对象)分配给名称空间字典中的x,该字典将传递给元类的__new__方法,并用于构建类的类型。
但是,在一个旧风格的类中,当您编写self.x = ...时,它将直接调用__setattr__,而不是使用描述符协议(self.__dict__['x'].__set__(x, ...))。因此,在您的self.x方法中分配给__init__将覆盖setter方法,而不是调用它。
https://stackoverflow.com/questions/49452036
复制相似问题