【发布时间】:2018-07-05 09:04:34
【问题描述】:
我正在尝试在下面的代码中使用 setter 验证我的类的一个属性。我要验证的属性称为“__x”,并设置为通过“init”方法传递的参数。当我将 'self__x' 更改为 'self.x' 时,它会按我的预期工作。我想要的是它如何与'self.x'一起工作,而我没有在getter和setter方法的任何地方返回'x'属性,为什么它不能与'self.__x'一起工作?
class P:
def __init__(self, x):
self.__x = x # not working
# self.x = x # working
@property
def x(self):
return self.__x
@x.setter
def x(self, x):
if x < 0:
self.__x = 0
else:
self.__x = x
p = P(-5)
print(p.x) # prints -5
【问题讨论】:
-
如果您输入
self.x = x,您将调用您编写的设置器。如果您输入self.__x = x,则表示属性self.__x正在包装x。 -
但是当我将 self.x = x 并在 setter 中说 self__x = 0 时,为什么它不返回 AttributeError?这是我无法理解的一点。
-
为什么会报错?您可以分配您喜欢的任何属性。
self.__x = x为您的对象创建属性__x。 -
有些类不能有属性,例如整数。否则,属性在 Python 中是免费的。如果您来自其他语言,例如 Java(只能具有您在类中定义的属性)或 Ruby(可以具有它想要的任何属性,但它们都是私有的),这可能会很奇怪。
-
正如我从您的回答中了解到的那样,python 在“init”函数之后隐式调用“setter”和“getter”(如果它们存在)。而在“property”装饰器下定义的“x”实际上覆盖了“init”函数中定义的“x”属性。这是真的吗?
标签: python oop getter-setter