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

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


person Community    schedule 06.04.2010    source источник


Ответы (6)


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

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

Подробнее см. в статье Гвидо Унификация типов и классов в Python 2.2.

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

person David Wolever    schedule 06.04.2010
comment
@thetaiko перечисляет некоторые другие вещи только для нового стиля, о которых полезно знать. - person David Wolever; 07.04.2010
comment
Для потомков стоит упомянуть, что классы нового стиля используются по умолчанию в Python3, и создание подклассов object не требуется. - person slightlynybbled; 23.06.2017

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

О разнице между классами new style и классами old style см. этот вопрос о переполнении стека. Для получения полной информации см. эту замечательную статью о типах и объектах Python.

person ChristopheD    schedule 06.04.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__()».

person thetaiko    schedule 06.04.2010

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

person msw    schedule 06.04.2010

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

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

person Mike DeSimone    schedule 06.04.2010

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

person jemfinch    schedule 06.04.2010