Подклассы из объекта - это то же самое, что и определение типа как метакласса?
Это класс в старом стиле:
class OldStyle:
pass
Это класс в новом стиле:
class NewStyle(object):
pass
Это также новый класс:
class NewStyle2:
__metaclass__ = type
Есть ли какая-либо разница между NewStyle
а также NewStyle2
?
У меня сложилось впечатление, что единственный эффект наследования от object
на самом деле, чтобы определить type
метакласс, но я не могу найти никакого подтверждения этому, кроме этого я не вижу никакой разницы.
1 ответ
Да, нет никакой разницы между NewStyle
а также NewStyle2
, Оба типа type
в то время как OldStyle
типа classobj
,
Если вы подкласс от объекта, __class__
из object
(имея в виду type
) будет использоваться; если вы поставите __metaclass__
это будет забрано.
Если ничего не предоставлено как __metaclass__
и ты не наследуешь от object
, Py_ClassType
назначен метаклассом для вас.
Во всех случаях, metaclass.__new__
собирается позвонить. За Py_ClassType.__new__
это следует за определенной семантикой (я никогда не исследовал их, действительно) и для type.__new__
это обязательно упаковать object
в основах вашего класса.
Конечно, подобный эффект достигается за счет:
cls = type("NewStyle3", (), {})
где вызов немедленно сделан type
; это просто большая проблема:-)