2008-12-01 3 views
36

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

+0

Какую версию Python вы используете. Из 2.6/3.0 POV это одно. Из 2.5 (и предыдущих) версий это другое. Что вы используете прямо сейчас? – 2008-12-01 22:01:02

+1

Возможный дубликат [В чем разница между старым стилем и новыми классами стилей в Python?] (Http: // stackoverflow.com/questions/54867/what-is-the-difference-from-old-style-and-new-style-classes-in-python) – vaultah 2015-07-22 14:38:46

+0

@Wendy Кажется, у вас было несколько лет, чтобы обдумать это сейчас , так что вы можете выбрать ответ на этот вопрос. Похоже, что сообщество высказало предположение. ;-) – Zak 2017-05-27 15:27:17

ответ

11

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

Это изменение было сделано в python 2.2, см. this PEP for an explanation отличий.

4

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

  • Метаклассы (как класс фабрики, но работает прозрачно)
  • свойства (геттеры & сеттеров ...)
38

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

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

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

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

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