Использование метода __setattr__ с getattr в классе - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть класс Python следующим образом:

class Base:
    def __init__(self, response=20):
        self.response = response

    def func1(self):
       self.response = 10

    def func2(self):
        self.response = 20

    def func3(self):
        self.response = 30

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

class Base:
    def __init__(self, response=20):
        self.response = response

    def __setattr__(self, name, value):
        if name == 'response':
            print('{} is set to {}'.format(name, value))

    def func1(self):
       self.response = 10

    def func2(self):
        self.response = 20

    def func3(self):
        self.response = 30

Вывод:

=============================================================
In [10]: a = Base()
response is set to 20

In [11]: a.func1()
response is set to 10

In [12]: a.func2()
response is set to 20

Работает очень хорошо.

Теперь я ввел еще один атрибут класса, значение которогоинициализируется поиском по словарю следующим образом:

my_dict = {20:'key1'}

class Base:
    def __init__(self, response=20):
        self.response = response
        self.key = getattr(my_dict,self.response).value

    def __setattr__(self, name, value):
        if name == 'response':
            print('{} is set to {}'.format(name, value))

    def func1(self):
        self.response = 10

    def func2(self):
        self.response = 20

    def func3(self):
        self.response = 30

Это дает сообщение об ошибке:

 ----> 6         self.key = getattr(my_dict,self.response)
AttributeError: 'Base' object has no attribute 'response'

Что я делаю неправильно. Также, если я удаляю метод __setattr__,getattr начинает работать.В чем здесь проблема?

1 Ответ

0 голосов
/ 26 февраля 2019

Вы должны вызвать родительскую реализацию __setattr__ для фактического создания атрибута:

def __setattr__(self, name, value):
    if name == 'response':
        print('{} is set to {}'.format(name, value))
    super.__setattr__(self,name,value)

Также, если вы хотите значение, связанное с использованием ключа словаря:

self.key = my_dict.get(self.response)

Вы можете найтиболее подробную информацию смотрите в официальной документации здесь (3.7) и здесь (2.7)

...