Как именно называются декораторы-декораторы? - PullRequest
0 голосов
/ 11 апреля 2020

Учитывая следующий код, который эмулирует статический метод:

class StaticMethod(object):
    "Emulate PyStaticMethod_Type() in Objects/funcobject.c"
    def __init__(self, f):
        self.f = f
    def __get__(self, obj, objtype=None):
        print('getting')
        return self.f

class A:
    def func2():
        print('hello')

    func2 = StaticMethod(func2)

Когда я звоню: A.func2 я получаю то, что ожидаю:

getting
<function __main__.A.func2>

Когда я звоню: A.func2() Я получаю:

getting
hello

Значит ли это, что всякий раз, когда вы вызываете метод Descriptor Decorator, Python сначала получает его из метода __get__ дескриптора?

Если да, то как тогда метод на самом деле вызывается? Что именно происходит под капотом?

1 Ответ

0 голосов
/ 11 апреля 2020

Значит ли это, что всякий раз, когда вы вызываете метод Descriptor Decorator, Python сначала получает его из метода get дескриптора?

Когда вы обращаетесь к атрибуту для объекта, где его класс имеет атрибут класса, который является дескриптором, объект вызывает __get__ и возвращает результат.

«Декоратор дескриптора» на самом деле не вещь, а тот факт, что декоратор используется установить дескриптор не имеет отношения к его функциональности.

Если, да, как тогда метод на самом деле вызывается? Что именно происходит под капотом?

Если вы имеете в виду базовую функцию, которая была украшена staticmethod, то метод вызывается всякий раз, когда вы вызываете его, дескриптор / staticmethod сам по себе не ' t предписывает это, он просто возвращает функцию.

...