ОК, вы добавили сюда множество идей! Я собираюсь вытащить несколько конкретных вопросов, которые у вас есть.
В общем, понимание супер, MRO и metclasses значительно усложнены, потому что за последние несколько версий Python было много изменений в этой сложной области.
Собственная документация Python - очень хороший справочник, и он полностью обновлен. Есть статья IBM developerWorks , которая хороша как введение и использует более обучающий подход, но учтите, что ей пять лет, и она тратит много времени на обсуждение более старых подходов к мета -классов.
super
- это способ доступа к суперклассам объекта. Это более сложное, чем (например) ключевое слово Java super
, в основном из-за множественного наследования в Python. Как объясняет Супер Считается Вредным , использование super()
может привести к неявному использованию цепочки суперклассов, порядок которой определяется Порядок разрешения методов (MRO).
Вы можете легко увидеть MRO для класса, вызвав mro()
для класса (не для экземпляра). Обратите внимание, что мета-классы не находятся в иерархии суперклассов объекта.
Томас 'описание мета-классов здесь отлично:
Метакласс - это класс класса.
Как класс определяет, как экземпляр
класса ведет себя метакласс
определяет, как ведет себя класс. Класс
является экземпляром метакласса.
В примерах, которые вы приводите, вот что происходит:
Звонок на __new__
идет
всплыл до следующей вещи в
MRO. В этом случае super(MyType,
cls)
будет преобразовано в type
;
вызов type.__new__
позволяет Python
завершить это нормальный экземпляр
шаги создания.
В этом примере используются мета-классы
для обеспечения единого. Он
переопределение __call__
в
метакласс, чтобы всякий раз, когда класс
экземпляр создан, он перехватывает
что, и может обойти экземпляр
создание, если уже есть один
(хранится в cls.instance
). Заметка
что переопределение __new__
в
метакласс не будет достаточно хорош,
потому что это называется только тогда, когда
создание класса . Переопределение
__new__
в классе будет работать,
однако.
Это показывает способ динамически
создать класс. Вот он
добавление имени предоставленного класса
на имя созданного класса, и
добавив его в иерархию классов
тоже.
Я не совсем уверен, какой пример кода вы ищете, но вот краткий пример, показывающий метаклассы, наследование и разрешение методов:
class MyMeta(type):
def __new__(cls, name, bases, dct):
print "meta: creating %s %s" % (name, bases)
return type.__new__(cls, name, bases, dct)
def meta_meth(cls):
print "MyMeta.meta_meth"
__repr__ = lambda c: c.__name__
class A(object):
__metaclass__ = MyMeta
def __init__(self):
super(A, self).__init__()
print "A init"
def meth(self):
print "A.meth"
class B(object):
__metaclass__ = MyMeta
def __init__(self):
super(B, self).__init__()
print "B init"
def meth(self):
print "B.meth"
class C(A, B):
__metaclass__ = MyMeta
def __init__(self):
super(C, self).__init__()
print "C init"
>>> c_obj = C()
meta: creating A (<type 'object'>,)
meta: creating B (<type 'object'>,)
meta: creating C (A, B)
B init
A init
C init
>>> c_obj.meth()
A.meth
>>> C.meta_meth()
MyMeta.meta_meth
>>> c_obj.meta_meth()
Traceback (most recent call last):
File "mro.py", line 38, in <module>
c_obj.meta_meth()
AttributeError: 'C' object has no attribute 'meta_meth'