Я понимаю декораторы на базовом уровне, но меня смущает @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