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

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

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

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

Нетерпеливое ожидание Ваших вкладов.

13
задан Carles Barrobés 25 May 2010 в 18:43
поделиться

5 ответов

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

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

2
ответ дан 2 December 2019 в 01:49
поделиться

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

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

0
ответ дан 2 December 2019 в 01:49
поделиться

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

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

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

3
ответ дан 2 December 2019 в 01:49
поделиться

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

class New(object):
  pass

class Old(object):
  def __new__(self):
    deprecation_warning("Old class is no more supported, use New class instead")
    return New()
0
ответ дан 2 December 2019 в 01:49
поделиться

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

Важная строка в каждом классе: __ metaclass__ = Reflection.GeneratedProtocolMessageType . Хотя подробности того, как работают метаклассы Python, выходят за рамки этого руководства, вы можете думать о них как о шаблоне для создания классов. Во время загрузки метакласс GeneratedProtocolMessageType использует указанные дескрипторы для создания всех методов Python, необходимых для работы с каждым типом сообщений, и добавляет их в соответствующие классы. Затем вы можете использовать полностью заполненные классы в своем коде.

2
ответ дан 2 December 2019 в 01:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: