在python中使用属性装饰器时在init中赋值

时间:2018-01-02 11:42:28

标签: python decorator

我试图在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?

谢谢!

1 个答案:

答案 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)

时,getter正确使用

注意:顺便说一下,对于私有变量更喜欢_x(单下划线)。双下划线具有特殊含义