Можно ли украсить функцию / метод __get__ методом? - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь понять, как методы работают как дескрипторы.

Там написано что-то вроде: this :

Для поддержки вызовов методов, функции включают в себя метод __get__() для методов привязки во время доступа к атрибутам. Это означает, что все функции не являются дескрипторами данных, которые возвращают связанные методы, когда они вызываются из объекта.

Основываясь на этом описании и том факте, что "Dotted access from a class calls __get__()" я предполагал, что можно декорировать __get__ метода класса.

Я пытаюсь обернуть someFunction.__get__:

def wrap(func):
    def wrapped(*args, **kwargs):
        print("Wrapping...")
        return func(*args, **kwargs)
    return wrapped

class SomeClass():
    def someFunction(self):
        print("someFunction called")
    someFunction.__get__ = wrap(someFunction.__get__)

obj = SomeClass()
obj.someFunction()

Вывод просто "someFunction called", как будто ничего не изменилось.

Итак, мой вопрос: почему Wrapping... журнал не печатается? Имеет ли присвоение:

someFunction.__get__ = wrap(someFunction.__get__)

что-нибудь?

1 Ответ

1 голос
/ 03 мая 2020

Из документации дескриптор :

Следующие методы применяются, только когда экземпляр класса содержит метод (так называемый дескриптор класс ) появляется в классе owner (дескриптор должен находиться либо в словаре классов владельца, либо в словаре классов для одного из его родителей).

Я понимаю, что это означает, что происходит какое-то волшебство c, которое требует, чтобы в классе было определено __get__ (в данном случае это функции). Это просто не будет работать, если вы добавите его в экземпляр. Я предполагаю, что Python должен выполнить некоторую инициализацию, когда определен класс дескриптора.

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