Как реализован интерфейс Zope? - PullRequest
2 голосов
/ 24 июля 2011

Я пытался понять, как работает интерфейс Zope. Я знаю, что Интерфейс - просто экземпляр InterfaceClass, который является просто обычным Классом. Но если Interface - это просто экземпляр класса, почему он может использоваться как базовый класс для наследования?

например. Класс IFoo (Интерфейс): передать

Не могли бы вы дать мне некоторые идеи? Спасибо.

1 Ответ

3 голосов
/ 28 июля 2011

Python по своей природе гибок, и любой объект может быть базовым классом, если он выглядит как базовый класс. Как всегда в случае с Python, это означает реализацию некоторых атрибутов, которые ожидаются найти в классах Python.

Класс Interface (или его основание Specification and Element) устанавливает несколько. Ищите любые переменные, начинающиеся с двойного подчеркивания (__), чтобы получить понимание:

  • __module__: строка, содержащая модуль пути Python.

  • __name__: имя, под которым был определен класс.

  • __bases__: базовые классы этого класса.

  • __doc__: (необязательно) Строка документации класса.

Кроме того, метод InterfaceClass __init__ будет вызываться при использовании в качестве базового класса; В основном Python рассматривает базовые классы как метаклассы, и каждый раз, когда мы используем его в определении класса, будет создан новый экземпляр класса базового класса (метакласс). Это означает, что методу __init__ будут переданы новые значения __name__ и __bases__, а также все новые атрибуты класса в качестве аргументов ключевых слов (включая __module__ и необязательный __doc__).

Все это задокументировано в разделе Стандартная иерархия типов документа модели данных Python (ищите абзац "классы" по специальным атрибутам) и в того же документа в пользовательской настройке. секция создания класса (базовые классы с атрибутом __class__ считаются типом).

Итак, любой экземпляр Python, который определяет как минимум атрибуты __module__, __name__ и __bases__, а подходящий метод __init__ будет работать в качестве базового класса для других классов. Python делает все остальное.

...