В учебниках я видел два типа именования атрибутов экземпляра с целью использования @property. Вот код, показывающий примеры обоих. Они также, кажется, работают по-разному.
class A:
def __init__(self, x):
self.x = x
@property
def x(self):
return self.__x
@x.setter
def x(self, x):
if x > 1000:
self.__x = 1000
else:
self.__x = x # Instance attribute __x defined outside __init__
class B:
def __init__(self, x):
self._x = x
@property
def x(self):
return self._x
@x.setter
def x(self, x):
if x > 1000:
self._x = 1000
else:
self._x = x
a = A(9999)
print(a.x) # -> 1000
b = B(9999) # -> 9999
print(b.x)
b.x = 9999
print(b.x) # -> 1000
Мне больше нравится поведение класса A, так как кажется, что @x.setter используется сразу в __init__, однако этот фрагмент кода выдает мне предупреждение в PyCharm (у меня это как комментарий). Почему должно быть предупреждение, если это правильное использование установщика свойств Python? В классе B предупреждений нет. Можно ли как-то вызвать @x.setter в __init__ так же, как и в классе A, без предупреждения?