Python: терминология 'class' VS 'type'

Просто вопрос: когда я должен использовать термин "класс", и когда я должен использовать термин "тип" в Python?

  • является "классом" только для пользовательских типов и "type" для встроенных типов?
  • или теперь, когда все является типом... я должен использовать всегда 'type' даже для пользовательских классов?
  • ...?

Ответ 1

Это более или менее исторически: они были разными давным-давно, которые больше не имеют практических последствий.

Изменить: Я использую "class", когда речь идет о конкретных реализациях и "type" более неформальным образом, когда речь идет о структурах данных высокого уровня, архитектуре приложений и т.д. В моем мышление типа является более общим, я не думаю о каждом классе как о отдельном типе.

Кроме того, когда я использую метаклассы (очень редко), я говорю о типах.

Ответ 2

Класс - это структура данных Python, которая может использоваться в качестве шаблона для экземпляров этого класса, вызывая его, например. foo = Foo().

Тип - это класс, который может использоваться в качестве шаблона для дополнительных классов посредством наследования, например. class Foo(Bar):

Так как Python поддерживает наследование, все классы могут использоваться в качестве шаблонов для дополнительных классов, а это значит, что все классы фактически являются типами.

Это особенно верно с момента появления "классов нового стиля", полученных из object, которые унифицируют иерархию типов пользовательских классов со встроенными типами. Классы всегда были типами, но теперь они представляют собой те же типы типов, что и встроенные типы.

Хотя классы Python являются типами, я все же считаю различие полезным, поэтому термины не являются полностью синонимами в моем сознании.

Определение бонуса: метакласс - это класс, экземпляры которого являются классами. В Python они должны быть получены из класса type, так же как объекты нового стиля выводятся из object.

Ответ 3

Я использую "тип", чтобы ссылаться на общий случай, но я переключаюсь на "класс", когда говорю об атрибутах.

Но это действительно не имеет значения, что вы выберете.

{} имеет тип dict. Метод iteritems() класса dict возвращает итератор.

Ответ 4

Можно сказать, что объект во время выполнения имеет определенный один тип, но с помощью (множественного) наследования его можно рассматривать как принадлежащий нескольким классам.

Ответ 5

Это может не отвечать на ваш вопрос напрямую, но это может дать вам ощущение разницы между типом и классом.

class Card:
   def __init__(self, suit=0, rank=0):
      self.suit = suit
      self.rank = rank
card1 = Card()

Card - объект класса, поэтому его тип type.

Однако card1 является экземпляром Card, поэтому его тип Card.