В Python определение класса (т. Е. Тело класса) называется объектом
На самом деле это все еще называется классом в Python.Вот почему вы определяете это так:
class Foo(object):
pass
Ключевое слово class
используется, потому что результат по-прежнему называется классом.
Слово object
в скобках, чтобы показать, чтоFoo является производным от класса object
.Не смущайтесь - любой существующий класс может быть использован здесь;на самом деле их больше, чем один.
Причина, по которой вы обычно выводите классы из object
, является исторической случайностью, но, вероятно, заслуживает подробностей.Исходная объектная реализация Python трактовала пользовательские классы и встроенные типы как разные вещи.Тогда разработчик языка решил объединить эти два понятия.В результате классы, производные от object
(или от потомка object
), ведут себя немного иначе, чем классы, которые не получены из object
и называются классами нового стиля.Классы старого стиля, с другой стороны, были определены так:
class Foo:
pass
class Bar(Foo):
pass
Обратите внимание, что они не наследуются от object
или от чего-либо еще, что наследуется от object
.Это делает их классами старого стиля.
При работе с Python 2.x ваши классы почти всегда должны наследоваться от object
, поскольку с объектами нового стиля приятнее работать несколькими небольшими, но важными способами.
Чтобы еще больше сбить с толку, в Python 3.0 и более поздних версиях нет классов старого стиля, поэтому вам не нужно явно выводить из object
.Другими словами, all вышеупомянутые классы будут классами нового стиля в Python 3.x.
Теперь вернемся к данному вопросу.Классы являются объектами, потому что в Python все является объектом.Списки, словари, целые числа, строки, кортежи ... все это объекты, как и строительные блоки программ Python: модули, функции и классы.Вы можете создать класс с помощью ключевого слова class
, а затем передать его функции, изменить его и т. Д. (Для полноты вы также можете создать класс с помощью функции type()
.)
Классэто шаблон для создания объектов, которые называются instance. Эта часть вам уже известна.Вы создаете объекты, аналогичные вызову функции, передавая начальные значения и другие параметры:
mylist = list("abc") # constructs ["a", "b", "c"]
За кулисами создается экземпляр, а затем вызывается метод __init__()
нового экземпляра для его инициализации.Поскольку в Python все является объектом, экземпляры класса также являются объектами.
И последнее, что вы хотели бы знать, это то, что так же, как классы являются шаблонами для создания объектов, так и можно иметь шаблоны для создания классов.Они называются метаклассами. Базовый метакласс называется type
(то есть обычный класс нового стиля является экземпляром type
).
(Да, это тот же type
, который я упоминал ранее, может использоваться для создания классов, и причина, по которой вы можете вызывать его для создания классов, заключается в том, что это метакласс.)
Чтобы создать свой собственный метакласс, вы извлекаете его из type
следующим образом:
class mymeta(type):
pass
Метаклассы - довольно продвинутая тема Python, поэтому я не буду вдаваться в то, для чего вы можете их использовать или как это сделатьэто, но они должны прояснить, как далеко Python берет концепцию «все является объектом».