Я понимаю декораторы на базовом уровне, но меня смущает @django.display()

Работаю с учебниками по django и наткнулся на следующий код:

@admin.display(
    boolean=True,
    ordering='pub_date',
    description='Published recently?',
)

Я понятия не имел, что это такое, поэтому немного погуглил и узнал, что такое декораторы в Python. Я чувствую себя комфортно в этой теме.

Однако во всех видео и документах, которые я просмотрел, я не видел примера, подобного @admin.display()

Только такие вещи, как @log или @timer. В основном это простой декоратор класса или функции.

Моя догадка состоит в том, что @admin.display - это декоратор, где admin - класс, а display - один из многих методов-оберток (возможно ли это вообще) в этом классе?

Просто запутался в синтаксисе, так как не могу найти ни одного подобного примера :(

)

Разобрать это можно следующим образом:

  • @ - это специальный синтаксис декоратора
  • .
  • admin и его атрибут display оба являются объектами
  • (boolean=True, ...) означает, что display должен быть вызываемым, т.е. display.__call__() будет выполняться
  • .

Когда вы видите что-то вроде:

@log
def my_method():
    return 'blah'

Это фактически то же самое, что: my_method = log(my_method)

Далее рассмотрим:

@configurable_log(config_val)
def my_method():
    return 'blah'

Что такое же, как: my_method = configurable_log(config_val)(my_method)

configurable_log - это вызываемая переменная, принимающая конфигурационные args (т.е. configurable_log(config_val)), которая возвращает другую вызываемую переменную, которой передается my_method. Другими словами, это то же самое, что и:

configured_log_decor = configurable_log(config_val)
@configured_log_decor  # a "no parens" decorator
def my_method():
    return 'blah'

Последняя оставшаяся часть - это обычный доступ к атрибутам, например:

SomeClass.attr_of_class
some_instance.attr_of_instance
some_module.attr_of_module
Вернуться на верх