Хорошее использование метаклассов в реальном мире (например, в Python) - PullRequest
13 голосов
/ 25 мая 2010

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

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

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

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

Ответы [ 5 ]

3 голосов
/ 26 мая 2010

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

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

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

2 голосов
/ 28 июня 2010

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

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

2 голосов
/ 27 мая 2010

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

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

0 голосов
/ 27 мая 2010

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

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 голосов
/ 25 мая 2010

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

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

...