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

Разница между классом foo и классом foo (object) в Python

Я знаю, что class foo(object) - это старый школьный способ определения класса. Но я хотел бы более подробно разобраться в различии между этими двумя.

4b9b3361

Ответ 1

До python 2.2 существовали по существу два разных типа класса: те, которые определены C-расширениями и C-кодированными встроенными (типами) и те, которые определены операторами (классами) класса python. Это привело к проблемам, когда вы хотели смешивать типы python и встроенные типы. Наиболее распространенной причиной этого является подклассификация. Если вы хотите подклассифицировать тип списка в коде python, вам не повезло, и поэтому вместо этого использовались различные обходные пути, такие как подклассификация реализации списков (в модуле UserList) на чистом python.

Это было довольно уродливо, поэтому в версии 2.2 был move, чтобы унифицировать типы python и builtin, включая возможность наследует от них. Результатом является "классы нового стиля". Однако они имеют некоторые несовместимые отличия от классов старого стиля, поэтому для обратной совместимости синтаксис простого класса создает класс старого стиля, а новое поведение получается путем наследования с объекта. Наиболее заметными различиями в поведении являются:

  • Порядок разрешения метода (MRO). Существует различие в поведении в алмазообразных иерархиях наследования (где A наследуется как от B, так и от C, которые наследуются от общего базового класса D. Ранее методы просматривались слева направо, сначала глубина (т.е. ABDCD). Однако если C перегружает член D, он не будет использоваться A (поскольку он сначала находит реализацию D) Это плохо для различных стилей программирования (например, с использованием классов mixin). Новые классы стиля будут рассматривать эту ситуацию как ABCD, (посмотрите атрибут __mro__ класса, чтобы увидеть порядок, который он будет искать)

  • Добавлен конструктор __new__, который позволяет классу действовать как метод factory, а не возвращать новый экземпляр класса. Полезно для возврата определенных подклассов или повторного использования неизменяемых объектов, а не создания новых, без необходимости изменять интерфейс создания.

  • Descriptors. Это функция, стоящая за такими свойствами, как свойства, методы класса, staticmethods и т.д. По сути, они обеспечивают способ управления тем, что происходит, когда вы получаете доступ или устанавливаете определенный атрибут в классе (новый стиль).

Ответ 2

class foo(object): - это "новый" способ объявления классов.

Это изменение было внесено в python 2.2, см. этот PEP для объяснения различий.

Ответ 3

Подклассификация object дает класс нового стиля. Два хорошо известных преимущества классов нового стиля:

  • Метаклассы (например, фабрики классов, но работают прозрачно).
  • Свойства (getters and setters...)

Ответ 4

Ссылка на это Объект в классе Foo (объект) предназначен для того, чтобы сделать ваш код на Python 3 совместимым с Python 2 и 3.