Skip to main content
 首页 » 编程设计

Python getter 、 setter

2025年05月04日13birdshome

class P: 
 
    def __init__(self,x): 
        self.x = x 
 
    @property 
    def x(self): 
        return self.__x 
 
    @x.setter 
    def x(self, x): 
        if x < 0: 
            self.__x = 0 
        elif x > 1000: 
            self.__x = 1000 
        else: 
            self.__x = x 

我正在尝试学习“getters”和“setters”方法。 当我使用这些输入创建一个实例时:

p1 = P(1001)  
print(p1.x) 
p1.x = -12 
print(p1.x) 

我得到的输出是:

1001 
-12 

我不知道为什么我得到的是 1001 和 -12 而不是 1000 和 0。

请您参考如下方法:

您真正的问题是您使用的是带有旧式类的 Python 2.x。所示代码将在 Python 3.x 上按预期工作(当然,损坏的缩进除外)。如果您通过显式继承自 object 使 P 成为新式类(例如,将其声明为 class P(object) :).

在旧式类中,问题在于您的 setter 和 getter 方法都被命名为 x,并且它们都在竞争同一命名空间中的条目。

当你有这样的代码时:

@x.setter 
def x(self, x): 
    ... 

发生的事情是使用您指定的代码创建一个新的函数对象(容易混淆,名为 x),然后调用 x.setter(x_function_object),并且无论 x.setter 返回什么(这将是一个定义了 __get__ 和 __set__ 的描述符对象)都被分配给 x在传递给元类的 __new__ 方法并用于构建类的类型的命名空间字典中。

但是,在旧式类中,当您编写 self.x = ... 时,它将直接调用 __setattr__ 而不是使用描述符协议(protocol) (self.__dict__['x'].__set__(x, ...))。因此,在您的 __init__ 方法中对 self.x 的赋值将覆盖 setter 方法,而不是调用它。