Какова цель создания подкласса класса «объект» в Python? - PullRequest
52 голосов
/ 07 апреля 2010

Все встроенные Python являются подклассами object, и я сталкиваюсь со многими пользовательскими классами, которые тоже. Зачем? Какова цель класса object? Это просто пустой класс, верно?

Ответы [ 6 ]

52 голосов
/ 07 апреля 2010

Короче, он освобождает волшебные пони.

В Python 2.2 и более ранних версиях использовались «классы старого стиля». Они представляли собой конкретную реализацию классов, и у них было несколько ограничений (например, нельзя встроить встроенные типы в подкласс). Исправление для этого состояло в том, чтобы создать новый стиль класса. Но выполнение этого повлекло бы за собой некоторые несовместимые назад изменения. Итак, чтобы убедиться, что код, который написан для классов старого стиля, все еще будет работать, класс object был создан, чтобы действовать как суперкласс для всех классов нового стиля. Итак, в Python 2.X class Foo: pass создаст класс старого стиля, а class Foo(object): pass создаст новый класс стиля.

Более подробно см. Гвидо Объединение типов и классов в Python 2.2 .

И вообще, неплохо бы привыкнуть делать все ваши классы в новом стиле, потому что некоторые вещи (декоратор @property - это то, что приходит на ум) не будут работать в старом стиле классы.

7 голосов
/ 07 апреля 2010

Краткий ответ: подклассы object фактически делают его классом в новом стиле (обратите внимание, что это не нужно, поскольку в Python 3.x этот режим автоматический)

Для разницы между new style классы и old style классы: см. этот вопрос о переполнении стека .Для полной истории: см. это хорошее описание типов и объектов Python .

4 голосов
/ 07 апреля 2010

Это связано с "новым стилем" классов. Подробнее об этом можно прочитать здесь: http://docs.python.org/tutorial/classes.html#multiple-inheritance, а также здесь: http://docs.python.org/reference/datamodel.html#new-style-and-classic-classes

Использование классов нового стиля позволит вам использовать "более новые, универсальные функции Python, такие как __slots__, дескрипторы, свойства и __getattribute __ ()."

3 голосов
/ 07 апреля 2010

Правильно, но это помечает класс как новый стиль класс. Вновь разработанные классы должны использовать базу object, потому что она стоит мало и гарантирует ваш код на будущее.

0 голосов
/ 07 апреля 2010

В Python 2.2 были введены «новые классы стилей» , которые имели ряд дополнительных функций по сравнению со старыми классами стилей, которые не подклассировали объект.Объект подклассов был выбран для указания того, что ваш класс должен быть новым, а не старым стилем.

0 голосов
/ 07 апреля 2010

Короче говоря, классические классы, которые не нуждаются в суперклассе, имеют ограничения, которые нельзя обойти, не нарушив много старого кода. Поэтому они создали концепцию классов нового стиля, которые подклассы из object, и теперь вы можете делать классные вещи, такие как определение свойств, а подклассы dict больше не являются упражнением от боли и странных ошибок.

Подробности в разделе 3.3 документации Python: Классы нового и классического стиля.

...