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
.