Объекты против экземпляра в Python - PullRequest
7 голосов
/ 16 июня 2011

В C ++ есть только объекты и классы, где объекты являются экземплярами классов.

В Python определение класса (т. Е. Тело класса) называется объектом. И объект в C ++ называется экземпляром в Python.

Проверка это

Я не прав?

РЕДАКТИРОВАТЬ: На самом деле может кто-то объяснить на примере различия объекта против экземпляра

РЕДАКТИРОВАНИЕ: В Python все будет наследоваться от объекта класса и, следовательно, все является объектом (т. Е. Объектом объекта класса).

Класс также является объектом (т. Е. Объектом объекта класса).

Экземпляр - это имя, используемое для вызова объекта любого класса (объект a.k.a c ++).

Пожалуйста, обратитесь это

Ответы [ 5 ]

18 голосов
/ 17 июня 2011

В 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 берет концепцию «все является объектом».

6 голосов
/ 16 июня 2011

С точки зрения терминологии, классы и экземпляры в Python называются objects , но для вас, как для обычного программиста Python, это не имеет значения. Вы можете видеть классы и экземпляры Python почти так же, как классы и экземпляры C ++:

class MyClass:
  data = 1

mc = MyClass()

MyClass - это класс , а mc - это экземпляр класса MyClass.


Python по своей природе гораздо более динамичен, чем C ++, поэтому его классы также являются объектами. Но программисты обычно не сталкиваются с этим, так что вы можете не беспокоиться об этом.

6 голосов
/ 16 июня 2011

Все в Python является объектом. Четные классы, которые являются экземплярами метаклассов .

1 голос
/ 16 июня 2011

Поскольку вы спросили «пожалуйста, по-английски», я постараюсь упростить его за счет детализации.

Давайте сначала проигнорируем классы и экземпляры и просто посмотрим на объекты.

Python объект содержит data и функции , как и объекты в любом другом объектно-ориентированном языке программирования.Функции, прикрепленные к объектам, называются методами .

x = "hello" #now x is an object that contains the letters in "hello" as data
print x.size() #but x also has methods, for example size()
print "hello".size() #In python, unlike C++, everything is an object, so a string literal has methods.
print (5).bit_length() #as do integers (bit_length only works in 2.7+ and 3.1+, though)

A class - это описание (или рецепт, если хотите) того, как создавать новые объекты.Говорят, что объекты, созданные в соответствии с описанием класса, принадлежат этому классу.Причудливое имя для принадлежности к классу - это экземпляр этого класса.

Теперь, ранее я писал, что в Python все является объектом.Ну, это относится и к таким вещам, как функции и классы.Таким образом, описание того, как создавать новые объекты, само по себе является объектом.

class C: #C is a class and an object
  a = 1

x1 = C() #x1 is now an instance of C
print x1.a #and x1 will contain an object a

y = C #Since C is itself an object, it is perfectly ok to assign it to y, note the lack of ()
x2 = y() #and now we can make instances of C, using y instead.
print x2.a #x2 will also contain an object a

print C #since classes are objects, you can print them
print y #y is the same as C.
print y == C #really the same.
print y is C #exactly the same.

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

1 голос
/ 16 июня 2011

В реальном смысле все в Python - это объект: класс (или любой другой тип) это объект, функция это объект, число это объект ... И у каждого объекта есть тип. «Тип» - это особый тип объекта ( класс, если вы хотите), с дополнительными данными, описывающими различные атрибуты типа (функции и т. д.). Если вы привыкли к C ++, вы может думать об этом как что-то вроде:

struct Type;

struct Object  //  The base class of everything.
{
    Type* myType;
    //  Some additional stuff, support for reference counting, etc.
};

struct Type : Object
{
    //  Lots of additional stuff defining type attributes...
};

Когда вы определяете новый класс в Python, вы на самом деле просто создаете новый экземпляр типа; когда вы создаете экземпляр этого класса, Python инициализирует myType член с указателем на правильный экземпляр Type.

Обратите внимание, что все динамично. Когда вы определяете тип Toto (выполняя определение класса & mdash; даже определение типа является вещь времени выполнения, а не время компиляции, как в C ++), интерпретатор Python создает экземпляр Type и помещает его в словарь (map<string, Object*>, на языке C ++) где-то. Когда переводчик встречает такое утверждение, как:

x = Toto()

, он ищет слово Toto в словаре: если упомянутый Object имеет тип Type, он создает новый экземпляр этого объекта, если он имеет введите Function (функции также являются объектами), он вызывает функцию. (В более общем случае тип / класс может вызываться или нет; если тип Object найден в словаре под Toto вызывает, Python интерпретатор делает все, что объект определил как «вызов». Сортировать как перегрузка operator()() в C ++. Перегрузка operator()() для Type означает создание нового объекта этого типа.)

И да, если вы родом из классического прошлого - строго процедурный, структурированные, полностью скомпилированные языки, это может быть довольно запутанным в первый.

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