Я читал статьи об ООП с 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 не требует их. Так что это должно рассматриваться как деталь реализации, и логика вашей программы никогда не должна полагаться на это (Тем не менее, ваша оптимизация производительности может основываться на этом.)