Хорошее использование метаклассов в реальном мире (например, на 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()