为什么 `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
我正在学习使用 @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