Какова цель создания подкласса класса "объект" в Python?

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

6 ответов

Решение

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

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

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

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

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

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

Это связано с "новым стилем" классов. Вы можете прочитать больше об этом здесь: http://docs.python.org/tutorial/classes.html, а также здесь: http://docs.python.org/reference/datamodel.html

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

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

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

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

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

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