Все встроенные модули Python являются подклассами object
, и я сталкиваюсь со многими определяемыми пользователем классами. Почему? Какова цель класса object
? Это просто пустой класс, верно?
Какова цель создания подкласса объекта класса в Python?
Ответы (6)
Короче говоря, он освобождает волшебных пони.
Короче говоря, Python 2.2 и более ранние версии использовали «классы старого стиля». Они были конкретной реализацией классов, и у них было несколько ограничений (например, вы не могли создавать подклассы для встроенных типов). Исправление для этого состояло в том, чтобы создать новый стиль класса. Но это потребует некоторых обратно несовместимых изменений. Итак, чтобы убедиться, что код, написанный для классов старого стиля, по-прежнему будет работать, был создан класс object
, который действует как суперкласс для всех классов нового стиля. Таким образом, в Python 2.X class Foo: pass
создаст класс старого стиля, а class Foo(object): pass
создаст новый класс стиля.
Подробнее см. в статье Гвидо Унификация типов и классов в Python 2.2а>.
И, вообще, хорошей идеей будет завести привычку делать все ваши классы в новом стиле, потому что некоторые вещи (на ум приходит декоратор @property
) не будут работать с классами в старом стиле.
object
не требуется.
- person slightlynybbled; 23.06.2017
Краткий ответ: создание подкласса object
фактически делает его классом нового стиля (обратите внимание, что это не нужно, так как в Python 3.x он автоматический)
О разнице между классами new style
и классами old style
см. этот вопрос о переполнении стека а>. Для получения полной информации см. эту замечательную статью о типах и объектах Python.
Это связано с «новым стилем» занятий. Подробнее об этом можно прочитать здесь: http://docs.python.org/tutorial/classes.html#multiple-inheritance, а также здесь: http://docs.python.org/reference/datamodel.html#new-style-and-classic-classes
Использование классов нового стиля позволит вам использовать «более новые, универсальные функции Python, такие как __slots__, дескрипторы, свойства и __getattribute__()».
Верно, но класс помечается как класс нового стиля. Вновь разработанные классы должны использовать базу object
, потому что это мало стоит и гарантирует будущее вашего кода.
Короткая версия заключается в том, что классические классы, которым не нужен суперкласс, имели ограничения, которые нельзя было обойти, не нарушив большого количества старого кода. Поэтому они создали концепцию классов нового стиля, которые являются подклассами object
, и теперь вы можете делать классные вещи, такие как определение свойств, а создание подклассов dict
больше не является мучительным упражнением и странными ошибками.
Подробности в разделе 3.3 документации Python: Новый и классический классы.
В Python 2.2 представлены "классы нового стиля" который имел ряд дополнительных функций по сравнению с классами старого стиля, которые не были подклассами объекта. Объект подклассов был выбран способом указать, что ваш класс должен быть классом нового стиля, а не классом старого стиля.