【发布时间】:2021-12-30 19:37:26
【问题描述】:
我正在使用 Python 3.8.6,这工作正常
class A:
@property
def _a(self):
return getattr(self, '_a_', 0)
@_a.setter
def _a(self, value):
self._a_ = value
a = A()
print(a._a) # prints 0
a._a = 10
print(a._a) # prints 10 as expected
这行不通
class A:
@property
def _a(self):
return getattr(self, '__a', 0)
@_a.setter
def _a(self, value):
self.__a = value
a = A()
print(a._a) # prints 0
a._a = 10
print(a._a) # prints 0 again
这真是令人兴奋!第一个和第二个例子的唯一区别是私有属性是__a而不是_a_
知道为什么吗?我无法弄清楚
【问题讨论】:
-
可能与前导双下划线表示的私有属性/方法有关,请参阅docs.python.org/3/tutorial/…
-
这确实解释了原因。如果你写一个答案,我会接受它作为一个解决方案。 “__spam 形式的任何标识符(至少两个前导下划线,最多一个尾随下划线)在文本上替换为 _classname__spam,其中 classname 是当前类名,前导下划线被剥离。这种修改是在不考虑句法的情况下完成的标识符的位置,只要它出现在类的定义中。”
标签: python properties