На второй вопрос уже дважды был получен хороший ответ, хотя __new__
на самом деле является статическим, а не классовым методом, как ошибочно заявлено в комментарии ...:
>>> class sic(object):
... def __new__(cls, *x): return object.__new__(cls, *x)
...
>>> type(sic.__dict__['__new__'])
<type 'staticmethod'>
Первый вопрос (как кто-то заметил) не имеет ничего общего с метаклассами: вы просто не можете умножить наследование от любых двух классов A и B в таком порядке, где B является подклассом A. E.g.:
>>> class cis(sic): pass
...
>>> class oops(sic, cis): pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
Cannot create a consistent method resolution
order (MRO) for bases sic, cis
MRO гарантирует, что самые левые базы посещаются раньше, чем самые правые, но это также гарантирует, что среди предков, если x является подклассом y, то x посещается до y. В этом случае невозможно выполнить обе эти гарантии. Конечно, есть веская причина для таких гарантий: без них (например, в классах старого стиля, которые гарантируют только порядок слева направо в разрешении метода, не ограничение подкласса) все переопределения в x будут игнорироваться в пользу определения в у, и это не может иметь большого смысла. Подумайте об этом: что означает , что значит наследовать от object
первого, а от какого-то другого класса - второго? Это определение object
(по существу несуществующее ;-) его нескольких специальных методов должно иметь приоритет над другим классом, в результате чего переопределения другого класса игнорируются?