Я ищу практические и не синтетические варианты использования декораторов классов Python. До сих пор единственный случай, который имел смысл для меня, - это регистрация класса в системе издатель-подписчик, например, плагины или события, что-то вроде:
@register
class MyPlugin(Plugin):
pass
или
@recieves_notifications
class Console:
def print(self, text):
...
Любые другие вменяемые случаи, о которых я думал, могли быть построены на основе методов наследования, метаклассов или декорирования. Не могли бы вы поделиться хорошими (или плохими!) Примерами использования декораторов классов?
Спасибо!
ABCMeta
, а не@abstractclass
декоратор классов.Ответы:
При написании модульных тестов, имеющих
@unittest.skipIf
и@unittest.skipUnless
могут использоваться как для отдельных методов, так и для целогоunittest.TestCase
определения класса. Это значительно облегчает написание тестов для конкретных платформ.Пример из
asyncio/test_selectors
источник
Декораторы классов были явно созданы, чтобы сделать некоторые вещи, которые уже могли быть выражены через метаклассы, более приятными, из PEP :
источник
Из этого вопроса переполнения стека:
источник
Поиск вариантов использования, которые можно выполнить с помощью декораторов классов, бесполезен - все, что можно сделать с помощью декораторов классов, можно сделать с помощью метаклассов. Даже ваш пример регистрации. Чтобы доказать это, вот метакласс, который применяет декоратор:
Python 2:
Python 3:
источник