Каков наилучший способ реализации дескрипторов декоратора в Python? - PullRequest
0 голосов
/ 22 марта 2020

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

class decorator:

    def __init__(self, f):
        self.f = f

    def __call__(self, *args, **kwargs):
        return self.f(*args, **kwargs)


class C:

    @decorator
    def f(self, x):
        print(x)

    @decorator
    @classmethod
    def h(cls, x):
        print(x)


@decorator
def g(x):
    print(x)

c = C()
c.f(1)  # Fails.
g(2)  # Works.
C.h(3)  # Fails.

Лучшее, что я могу придумать, это:

class decorator:

    def __get__(self, instance, owner):
        return type(self.f).__get__(self.f, instance, owner)

Интересно, это правильный способ реализации дескрипторов? Должен ли я аналогичным образом реализовать __del__ и __set__?

...