Разница между классом foo и классом foo (объект) в Python - PullRequest
46 голосов
/ 02 декабря 2008

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

Ответы [ 4 ]

42 голосов
/ 02 декабря 2008

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

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

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

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

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

12 голосов
/ 02 декабря 2008

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

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

4 голосов
/ 02 декабря 2008

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

  • Метаклассы (как фабрики классов, но работает прозрачно)
  • Свойства (геттеры и сеттеры ...)
0 голосов
/ 27 апреля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...