Напечатать что-нибудь, когда доступ к атрибуту

Я пытаюсь распечатать что-то, когда я получаю доступ к атрибуту класса с помощью __getattribute__Большая проблема здесь - рекурсия и тот факт, что я переопределяю метод getattribute.

Боюсь, мне придется использовать метакласс для решения этой проблемы. Во всяком случае, если у вас есть ответ на эту проблему.

1 ответ

Решение

__getattribute__ используется для доступа ко всем атрибутам в вашем экземпляре. Это включает self.recursion в этом методе.

Вам редко нужно использовать __getattribute__, Если у вас действительно есть подходящий вариант использования, избегайте доступа к атрибутам или использования super(A, self).__getattribute__() чтобы избежать бесконечных проблем рекурсии.

Для вашего варианта использования (печать чего-либо при обращении к атрибуту) используйте super() еще вернуть оригинальный атрибут:

class A(object):
    def meth(self):
        return "met"

    def __getattribute__(self, name):
        print "IN CLASS A"
        return super(A, self).__getattribute__(name)

Обратите внимание, что для super() для работы нужно использовать класс нового стиля, наследуя от object, Если вы наследуете от чего-то другого, и это что-то еще имеет __getattribute__ метод, это уже класс нового стиля.

Другие вопросы по тегам