Когда создается «экземпляр»? - PullRequest
0 голосов
/ 18 января 2019

Я читал статьи об ООП с python, в частности этот .

Автор этой статьи имеет описание, а затем пример кода:

Синтаксис Python для создания экземпляра класса аналогичен функции звоните

>>> b = int()
>>> type(b)
<type 'int'>

Этим я делаю вывод, что «экземпляр» существует в момент казни, а не раньше. Когда вы выполняете type(b), это экземпляр класса int ().

Но потом я прочитал ответ о переполнении стека :

Экземпляр - это переменная, хранящая адрес памяти объекта.

Что немного смущает меня по поводу этого термина. Поэтому, когда я назначаю переменную в момент выполнения, создается «экземпляр»?

Наконец, это объяснение в ComputerHope указывает на тот факт, что экземпляры совпадают с назначениями переменных:

function Animal(numlegs, mysound) {
this.legs = numlegs;
this.sound = mysound;
}
var lion = new Animal(4, "roar");
var cat = new Animal(4, "meow");
var dog = new Animal(4, "bark");

Объект Animal учитывает количество ног и звук животное заставляет быть установленным каждым экземпляром объекта. В этом случае, все три экземпляра (лев, кошка и собака) имеют одинаковое количество ног, но издают разные звуки.

Может ли кто-нибудь на самом деле дать четкое определение, когда экземпляр закрывается?

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Я читал статьи об ООП с python, в частности этот .

Автор этой статьи имеет описание, а затем пример кода:

Синтаксис Python для создания экземпляра класса аналогичен вызову функции

>>> b = int()
>>> type(b)
<type 'int'>

Также прочтите предложение до этого:

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

Таким образом, экземпляр класса - это объект, у которого этот класс имеет свой тип.

Таким образом, я делаю вывод, что «экземпляр» существует в момент выполнения, а не до.

Да, правильно.«Экземпляр» и «экземпляр» являются концепциями среды выполнения в Python.

Когда вы выполняете type(b), это экземпляр класса int ().

Не совсем.

Экземпляр int начинает существовать при вызове int(). 1 Этот процесс - это то, что называется "создание экземпляра" и результат (который возвращается этимcall, и в этом примере затем присваивается b) "экземпляр" int.

Но затем я читаю этот ответ переполнения стека :

Экземпляр - это переменная, которая хранит адрес памяти объекта.

Да, это не совсем правильно.Это сам объект (значение по этому адресу памяти, если хотите), который является экземпляром.Несколько переменных могут быть связаны с одним и тем же объектом (и, следовательно, одним и тем же экземпляром).Есть даже оператор для тестирования: is

>>> a = 5
>>> b = a
>>> a is b
True

, что немного смущает меня по поводу этого термина.Поэтому, когда я назначаю переменную в момент выполнения, создается «экземпляр»?

Нет, тогда экземпляр является привязанным к этой переменной.В Python думать о переменных просто как «имена для значений».Таким образом, привязка объекта к переменной означает присвоение этому объекту этого имени.Как мы видели выше, объект может иметь несколько имен.

Вы можете использовать экземпляр, не назначая его какой-либо переменной, т. Е. Не называя его, например, передавая его функции:

>>> print(int())
0

Наконец, это объяснение в ComputerHope указывает на тот факт, что экземпляры совпадают с назначениями переменных:

function Animal(numlegs, mysound) {
this.legs = numlegs;
this.sound = mysound;
}
var lion = new Animal(4, "roar");
var cat = new Animal(4, "meow");
var dog = new Animal(4, "bark");

Объект Animal допускает количествоноги и звук, издаваемый животным, чтобы быть установленным каждым экземпляром объекта.В этом случае все три экземпляра (лев, кошка и собака) имеют одинаковое количество ног, но издают разные звуки.

К сожалению, такое объяснение на ComputerHope, вероятно, запутает большинство читателей.больше, чем это помогает им.Во-первых, он объединяет термины «класс» и «объект».Они не имеют в виду то же самое.Класс - это шаблон для одного типа объектов.Объекты и шаблоны для типа объектов - это не одно и то же понятие, точно так же, как резаки печенья - это не то же самое, что куки.

Конечно, [для понимания] это не особенно помогает вPython, классы являются (специальными, но не слишком специальными) объектами (типа type) и, что в JavaScript до введения концепции class обычно использовались простые объекты в качестве шаблонов для другихобъекты.(Последний подход известен как « на основе прототипа ориентация объекта» или «наследование на основе прототипа». В отличие от этого, большинство других объектно-ориентированных языков, включая Python, используют ориентирование на основе классов / наследование на основе классов.Я не совсем уверен, к какой категории относится современный ECMAScript с ключевым словом class.)

Может ли кто-нибудь дать четкое определение экземпляра?

Как янаписал далее: экземпляр класса является объектом , который имеет этот класс в качестве своего типа .

Таким образом, «экземпляр» - это всегда «экземпляр из » чего-либо. Это также отвечает на лингвистический взгляд на вопрос в заголовке

Когда я должен назвать это «экземпляром»?

Вы должны называть это «экземпляром», когда хотите назвать его «экземпляром из » чего-либо (обычно класса).


1 Я не сказал всю правду. Попробуйте это:

>>> a = int()
>>> b = int()
>>> a is b
True

Подождите что? Разве два вызова int не должны возвращать каждый новый экземпляр, и, следовательно, два разных?

То, что случилось бы с большинством типов, но некоторые встроенные типы отличаются, int является одним из них. Создатели реализации CPython знают, что маленькие целые числа используются очень часто. Таким образом, они позволяют CPython создавать новые все время, они просто повторно используют одно и то же целое число (один и тот же объект / экземпляр) каждый раз, когда требуется одно и то же значение. Поскольку целые числа Python являются неизменяемыми, это обычно не вызывает каких-либо проблем и экономит много памяти и времени на создание объектов в программах, требующих большого объема вычислений.

Стандарт Python позволяет реализациям осуществлять эту оптимизацию, но AFAIK не требует их. Так что это должно рассматриваться как деталь реализации, и логика вашей программы никогда не должна полагаться на это (Тем не менее, ваша оптимизация производительности может основываться на этом.)

0 голосов
/ 19 января 2019

Обычно в ООП

Классы и объекты являются двумя основными аспектами объектно-ориентированного программирование. Класс создает новый тип, где объекты являются экземплярами класс.

Как объяснено здесь .

Таким образом, каждый раз, когда объект создается, он называется экземпляром.

Python не имеет значения в этой концепции, однако вещи немного отличаются от других языков, таких как, например, Java.

На самом деле в Python все является объектом, даже сами классы.

Вот краткое объяснение того, как это работает:

Учитывая этот фрагмент:

>>> class Foo:
...     pass
... 
>>> type(Foo)
<type 'type'>
>>> 

Класс Foo - это тип type, который является метаклассом для всех classes в Python (Однако существует различие между «старыми» и «новыми» классами, больше здесь , здесь и здесь ).

Класс type, будучи классом, сам по себе является экземпляром:

>>> isinstance(type, type)
True

Итак, Foo, хотя и является определением класса, интерпретатор интерпретирует его как объект.

Объекты как экземпляры создаются с такими операторами, как foo = Foo(), foo являющийся объектом, наследуемым от object класса.

>>> isinstance(foo, object)
True

Этот класс предоставляет все методы, которые нужны объекту, такие как __new__() и __int__() ( new , init ). Короче говоря, первый используется для создания нового экземпляра класса, последний вызывается после того, как экземпляр был создан, и используется для инициализации значений, как вы это сделали с Animal.

Тот факт, что все является объектом, также означает, что мы можем создавать забавные фрагменты кода, подобные этому:

>>> class Foo:
...     var = 'hello'
... 
>>> foo = Foo()
>>> foo.var
'hello'
>>> foo.other_var = 'world'
>>> foo.other_var
'world'
>>> Foo.other_var
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'Foo' has no attribute 'other_var'
>>> Foo.var
'hello'
>>> 

Здесь я добавил атрибут объекта во время выполнения. Этот атрибут будет единственно в foo, сам класс или любые другие экземпляры не будут иметь его. Это называется переменная экземпляра и переменная класса .

Надеюсь, все это имеет смысл для вас.

TL; DR

В Python все (определения классов, функции , модули и т. Д.) Интерпретируются интерпретатором как объекты. Поэтому «все» является экземпляром.

...