Я изучаю, как работают свойства / геттеры / сеттеры, но я не могу заставить их работать:
class Person:
def __init__(self, age=20):
self.age = age
def set_age(self, new_age):
if new_age > 0 and new_age < 120:
self.age = new_age
age = property(set_age)
i=Person()
i.age = 21
Поскольку age
было присвоено свойство set_age
, я должен иметь возможность использовать установить возраст, но вместо этого я получаю ошибку атрибута:
Traceback (most recent call last):
line 11, in <module>
i=Person()
line 3, in __init__
self.age = age
AttributeError: can't set attribute
Я попытался сделать self.age
приватным в __init__
, переименовав это self._age
(не знаю почему, я видел много примеров, которые использовали приватный Атрибуты так решили попробовать) и все равно получил ошибку, но уже не в __init__
:
Traceback (most recent call last):
line 12, in <module>
i.age = 21
AttributeError: can't set attribute
Это странно, частное именование это просто соглашение, но здесь оно фактически меняет количество ошибок .
Я думал, что так как свойство может иметь методы getters / setters / del / do c, мне пришлось указать, что оно является установщиком, изменив его на:
age = property(fset=set_age)
Но это дало RecursionError
ошибка.
В чем проблема?
Редактировать: изменили &
на and
и проблема продолжается.