为什么 `self.__x` 不起作用而 `self.y` 起作用了?

Why is `self.__x` not working but `self.y` is?

我正在学习使用 @property 装饰器。我有以下两个代码片段:

代码 1

class P2:
    def __init__(self, x):
        self.x = x
    @property
    def x(self):
        return self.y
    @x.setter
    def x(self, x):
        if x < 0:
            self.y = x
        elif x > 1000:
            self.y = 1000
        else:
            self.y = x
   
p1 = P2(7600)
print(p1.y)

代码2

class P2:
    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 = x
        elif x > 1000:
            self.__x = 1000
        else:
            self.__x = x
   
p1 = P2(7600)
print(p1.__x)

为了获得代码 2,我将代码 1 中的 y 替换为 __x。但问题是代码 1 运行 完全没问题,但代码 2 出现错误 'P2' object has no attribute '__x'.

我的理解是 y__x 只是两个变量,它们的行为应该相同,所以在我看来 code2 和 code1 是相同的,两者应该给出相同的输出。

但是,这并没有发生。我的理解有什么问题吗?

带有双下划线的属性是 pseudo-private。 (与 Java 或 C++ 不同,Python 中没有完全私有变量的概念。)

要访问 pseudo-private 成员变量,请将双下划线替换为 _<name of your class>__(即一个下划线,后跟 class 名称,再后跟两个下划线)。话虽这么说,如果你需要这样做,你应该首先考虑为什么变量是pseudo-private。

class P2:
    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 = x
        elif x > 1000:
            self.__x = 1000
        else:
            self.__x = x
   
p1 = P2(7600)
print(p1._P2__x) # Prints 1000