我试图在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)在这个例子中,公共&#39; x&#39;这里?我知道它用于封装,但这是变量&#39; x&#39;现在是班上的一员吗? OR类只有私有变量__x?
谢谢!
答案 0 :(得分:4)
公共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)
注意:顺便说一下,对于私有变量更喜欢_x
(单下划线)。双下划线具有特殊含义