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

问题描述 投票:0回答:1

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

谢谢!

python decorator
1个回答
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(单下划线)为你的私有变量。双下划线具有特殊含义

© www.soinside.com 2019 - 2024. All rights reserved.