Подклассы из объекта - это то же самое, что и определение типа как метакласса?

Это класс в старом стиле:

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; это просто большая проблема:-)

Другие вопросы по тегам