Почему установщик свойств не работает должным образом? - PullRequest
1 голос
/ 11 февраля 2020

Я изучаю, как работают свойства / геттеры / сеттеры, но я не могу заставить их работать:

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 и проблема продолжается.

1 Ответ

2 голосов
/ 11 февраля 2020

Проблема заключается в том, что имя свойства, свойства класса и входные данные функции сеттера должны отличаться. Кроме того, вы должны реализовать геттер. Рабочий пример:

class Person:
    def __init__(self, age=20):
        self._age = age

    def set_age(self, new_age):
        print(new_age)
        if new_age > 0 and new_age < 120:
            self._age = new_age

    def get_age(self):
        return self._age

    age = property(get_age, set_age)

i=Person()
i.age = 21
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...