我试图在python中学习@property。我刚写了一个例子:
class sample(object):
def __init__(self,a):
self.x=a ---> why is this assignment mandatory here?, I tried without and fail
@property
def x(self):
print "getter"
return self.__x
@x.setter
def x(self,a):
print "setter"
if a<=100 and a>=0:
self.__x=a
elif a<0:
self.__x=0
else:
self.__x=100
ob=sample(30)
print ob.x
1)为什么在这种情况下需要self.x = a in init?
2)在这个例子中,公共'x'的重要性在这里是什么?我知道它用于封装,但是这个变量'x'现在是类的成员吗? OR类只有私有变量__x?
谢谢!
公共x
是一个功能(实际上,两个)。它会覆盖实际的变量赋值。所以,如果你有财产,当你这样做
obj.x = 5
它相当于调用值为5的@x.setter
函数。同样,当你使用obj.x
时,它会调用obj.x()
属性。实际变量是“私人”self.__x
。
因此,一般来说,第一项任务并非“需要”。但是,在这种特殊情况下,当你调用print(obj.x)
时,相应的属性会尝试查找尚不存在的obj.__x
。但是,如果在第一行中进行赋值self.x = 30
,它会使用参数30调用@x.setter
函数。此函数创建self.__x
变量,因此它现在存在,并且当你print(obj.x)
时它可以被getter正确使用
注意:顺便说一句,更喜欢_x
(单下划线)为你的私有变量。双下划线具有特殊含义