Хорошее использование метаклассов в реальном мире (например, на Python)

Я изучаю метаклассы в Python. Я думаю, что это очень мощный метод, и я ищу для них хорошее применение. Мне хотелось бы получить отзывы о хороших реальных реальных примерах использования метаклассов. Я не ищу пример кода для написания метакласса (есть много примеров бесполезных метаклассов), но реальные примеры, где вы применили эту технику, и это было действительно подходящее решение. Правило: нет теоретических возможностей, но метаклассы при работе в реальном приложении.

Я начну с одного из примеров, которые я знаю:

  • модели Django, для декларативного программирования, где базовый класс Model использует метакласс для заполнения объектами модели полезной функциональности ORM из определений атрибутов.

Ждем ваших вкладов.

Ответы

Ответ 1

FormEncode валидаторы и Turbogears/Tosca виджеты.

Вас также может заинтересовать класс декораторы: они могут быть написаны с последними версиями и охватывают многие варианты использования, которые ранее обрабатывались с помощью метаклассов.

Ответ 2

В Python 2.6 и 3.1 стандартная библиотека Python предоставляет abc.ABCMeta, метакласс для абстрактных базовых классов ( "ABCs" ). Классы, которые используют метакласс, могут использовать @abstractmethod и @abstractproperty для определения абстрактных методов и свойств. Мета-класс гарантирует, что производные классы переопределяют абстрактные методы и свойства.

Кроме того, классы, реализующие ABC, фактически не наследуя от него, могут регистрироваться как реализация интерфейса, так что issubclass и isinstance будут работать.

Например, модуль collections определяет Sequence ABC. Он также вызывает Sequence.register(tuple) для регистрации встроенного tuple типа как Sequence, хотя tuple фактически не наследует от Sequence.

Ответ 3

Реализация протокольных буферов на Python использует метаклассы для создания привязок Python, которые представляют ваш формат данных. Из учебника:

Важная строка в каждом классе __metaclass__ = reflection.GeneratedProtocolMessageType. Хотя информация о том, как работают метаклассы Python, выходит за рамки данного руководства, вы можете думать о них как о шаблоне для создания классов. Во время загрузки метакласс GeneratedProtocolMessageType использует указанные дескрипторы для создания всех методов Python, необходимых для работы с каждым типом сообщения, и добавляет их в соответствующие классы. Затем вы можете использовать полностью заполненные классы в своем коде.

Ответ 4

SQLalchemy также использует их для декларативных моделей баз данных.

Извините, мой ответ не сильно отличается от вашего примера, но если вы ищете пример кода, я обнаружил, что declarative является достаточно читаемым.

Ответ 5

Единственный раз, когда я использовал метакласс, заключался в том, чтобы написать механизм предупреждения об отказе. Это было что-то в следующих строках: синтаксис может быть очень аппроксимативным, но код будет легче иллюстрировать мою точку, чем сложное предложение:

class New(object):
  pass

class Old(object):
  def __new__(self):
    deprecation_warning("Old class is no more supported, use New class instead")
    return New()