Подтвердить что ты не робот

Class ClassName и класс ClassName (объект)

В чем разница между:

class ClassName(object):
    pass

и

class ClassName:
    pass

Когда я вызываю функцию справки модуля этого класса, вы можете прочитать ____builtin____.object для первого случая только под заголовком справки CLASS. Во втором случае он просто показывает имя класса. Существует ли какая-либо функциональная разница между этими классами и/или возможными способами?

(Я знаю, что class Classname(ParentClassName) имеет функциональное назначение)

4b9b3361

Ответ 1

В Python 2.x, когда вы наследуете "объект", вы являетесь классом "новый стиль", который был реализован обратно в Python 2.2 (около 2001 года). Неверяющий из "объекта" случай создает "старый" стиль ", который фактически поддерживался только для обратной совместимости.

Большим преимуществом классов "нового стиля" является унификация типов на Python - до этого нельзя было подклассифицировать встроенные типы, такие как int, list, dict, правильно. Был также указан "протокол дескриптора", который описывает протокол для извлечения и установки атрибутов в объекте, что дает языку большую гибкость. (Это более заметно, если вы используете свойство Python в классе).

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

Настоятельно рекомендуется , что в Python 2.x все ваши классы являются новым стилем - использование классов старого стиля может работать в некоторых простых случаях, но они могут генерировать много тонких, сложных найти, ошибки, когда вы пытаетесь использовать свойства, рассол, дескрипторы и другие дополнительные функции. Прежде всего, когда вы пытаетесь проверить "тип" объекта, он будет таким же (тип "экземпляр" ) для всех объектов из классов старого стиля, даже если они из разных пользовательских классов.

В версиях Python 3.x все классы являются новым стилем - не нужно устанавливать метакласс.

Документация Python "datamodel" - это "книга права", в которой поведение обоих class typess определяется подробно (достаточно, чтобы можно было переопределить язык):

http://docs.python.org/reference/datamodel.html

Это сообщение в блоге от Guido рассказывает о мотивах новых классов стиля на более легком языке:

http://python-history.blogspot.com.br/2010/06/new-style-classes.html

http://docs.python.org/release/2.5.2/ref/node33.html

Ответ 2

ClassName(object) использует новый класс style: http://docs.python.org/release/2.5.2/ref/node33.html

Второй пример демонстрирует класс старого стиля.

В python 3 по умолчанию используются новые классы стилей, и вам больше не понадобится подкласс object.