Это декоратор какого-то типа в Python?

1

Я читал какой-то код и натолкнулся на это ниже.

Я не понимаю, является ли @SdServer.appId(APP_ID) декоратором. У этого есть @от декоратора, но метод класса appId не похож на синтаксис декоратора, к которому я привык. Я не понимаю, что это делает.

Операторы печати, которые я включаю в конце, ищущие appID в классе SdApp, возвращают это:

SdApp class instance ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'request'] 

SdApp instance request ['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__func__', '__ge__', '__get__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__'] 

method list ['request']

Код

APP_ID = 'oA'

class SdServer(object):
    APP_ID_HANDLERS = {}

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

    @classmethod
    def appId(cls, appId):
        def _handler(f):
            cls.APP_ID_HANDLERS[appId] = f
            return f

        return _handler


@SdServer.appId(APP_ID)
class SdApp(object):
    @classmethod
    def request(cls, originator, body=None):
        try:
            print(cls)
        except OException as e:
            log.error('Cannot process request: %s', e)

# me trying to figure out what it is doing below

first = SdApp()

print('SdApp class instance', dir(first), '\n')
print('SdApp instance request', dir(first.request), '\n')

method_list = [func for func in dir(SdApp) if callable(getattr(SdApp, func)) and not func.startswith("__")]

print('method list', method_list)
  • 1
    да это декоратор
  • 0
    @ dangee1705, просто я не вызываю класс должным образом, чтобы увидеть результат использования декоратора?
Показать ещё 5 комментариев
Теги:
decorator

1 ответ

2
Лучший ответ

Сам класс-метод не является декоратором, а скорее его возвращаемым значением. В вашем примере @SdServer.appId(APP_ID) будет вызывать метод класса и использовать результат в качестве декоратора. Следуя вашему примеру, это будет функция _handler которая, как представляется, регистрирует декорированный класс с классом SdServer. Этот возвращенный декоратор содержит замыкания над cls и переменными appId следовательно, несколько запутанную реализацию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню