什么时候创建“实例”?

米格尔·奥尔蒂斯(Miguel Ortiz)

我一直在阅读有关使用python进行OOP的文章,特别是这篇文章

该文章的作者有一个描述,然后是一个代码示例:

实例化类的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");

“动物”对象允许通过对象的每个实例设置动物的腿部数量和声音。在这种情况下,所有三个实例(狮子,猫和狗)的腿数相同,但声音不同。

谁能实际提供实例退出的清晰定义?

我一直在阅读有关使用python进行OOP的文章,特别是这篇文章

该文章的作者有一个描述,然后是一个代码示例:

实例化类的Python语法与函数调用相同

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

还请阅读前面的句子:

一旦有了一个类,就可以实例化它以获取该类型的具体对象(实例),即根据该类的结构构建的对象。

因此,类的实例是具有该类作为其类型的对象。

据此,我推断“实例”在执行时而不是在执行时存在。

是,对的。“实例”和“实例”是Python中的运行时概念。

当您执行时type(b),这就是类int()的实例。

不完全的。

int实例在int()被调用时开始存在1过程称为“实例化”,结果(此调用返回该结果,然后在此示例中分配给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");

“动物”对象允许通过对象的每个实例设置动物的腿部数量和声音。在这种情况下,所有三个实例(狮子,猫和狗)的腿数相同,但声音不同。

不幸的是,有关ComputerHope的解释可能会使大多数读者感到困惑,而不是帮助他们。首先,它把术语“类”和“对象”混为一谈。他们的意思不同。类是一种类型的对象的模板。一类对象的对象和模板的概念不同,就像Cookie切割器与Cookie的含义不同。

当然,[为了理解]在Python中,类(特殊的,但不是太特殊的)对象(类型type),在JavaScript中直到class引入概念之前,习惯使用纯对象并没有特别的帮助。作为其他对象的模板。(后一种方法称为“基于原型的面向对象”或“基于原型的继承”。相比之下,大多数其他面向对象的语言(包括Python)都使用基于类的面向对象/基于类的继承。我不太确定带有class关键字的现代ECMAScript属于哪个类别。)

谁能真正提供实例的清晰定义?

就像我写的进一步上涨:一个实例一类是对象具有该类作为它的类型

因此,一个“实例”始终是一个“实例东西”。这也回答了标题中对语言问题的看法

我什么时候称它为“实例”?

当你想叫它“例如,你应该把它叫做“实例”东西(通常是一个类)”。


1我还没有说完整的话。尝试这个:

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

等等什么 的两个调用是否应该int各自返回新实例,从而返回两个不同的实例?

大多数类型都会发生这种情况,但是其中一些内置类型是不同int的。CPython实现的制造商意识到,经常使用小整数。因此,他们让CPython始终创建新的整数,只是每次需要相同的值时,它们都重新使用相同的整数(相同的对象/实例)。由于Python整数是不可变的,因此通常不会引起任何问题,并在计算密集型程序中节省大量内存和对象创建时间。

Python标准允许实现进行此优化,但AFAIK不需要它们。因此,应将其视为实现细节,并且程序逻辑永远不应依赖于此。(不过,您的性能优化可能会依赖它。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章