Я использую 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
Это сногсшибательно! единственное различие между первым и вторым примером заключается в том, что атрибут private является __a
вместо _a_
Есть идеи, почему? Я не смог этого понять
classname
будет нарушен для подклассов, потому что задатчик записан в базовом классе, поэтому имя атрибута все равно будет искажено до_A__a
.