Eu estou usando Python 3.8.6 e isso funciona bem
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
Isto não funciona
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
Que o sopro da mente! a única diferença entre o primeiro e o segundo exemplo é o de que o atributo é privado __a
em vez de _a_
Alguma idéia de por que? Eu não era capaz de descobrir
classname
vai quebrar por subclasses, porque o enunciador está escrito na classe base para o atributo nome ainda vai ser deturpados para_A__a
.