什么时候创建“实例”?

时间:2019-01-18 19:43:41

标签: python concept

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

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

  

实例化类的Python语法与函数相同   呼叫

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

据此,我推断“实例”在执行时而不是在执行时存在。当您执行type(b)时,它就是类int()的实例。

但是我读了stack overflow answer

  

Instance是一个变量,用于保存对象的内存地址。

这个词使我有些困惑。那么,当我在执行时分配变量时,会创建“实例”吗?

最后,此explanation in 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");
  

动物对象允许腿的数量和声音   动物根据对象的每个实例进行设置。在这种情况下,   这三个实例(狮子,猫和狗)的腿数相同,   但发出不同的声音。

实际上有人可以提供实例退出的清晰定义吗?

2 个答案:

答案 0 :(得分:1)

通常在OOP中

  

类和对象是面向对象的两个主要方面   编程。一个类创建一个新的类型,其中对象是   班级。

here所述。

因此,每次创建对象时,它就称为实例。

Python在这个概念上没有区别,但是与其他语言(例如Java)略有不同。

实际上,在Python中,一切都是对象,甚至是类本身。

以下是其工作原理的简要说明:

考虑以下代码段:

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

Foo的类型为type,它是Python中所有classes的元类 (不过,“旧”类和“新”类之间有区别,更多的是hereherehere)。

type是一个类,是它本身的一个实例:

>>> isinstance(type, type)
True

Foo尽管是类定义,但解释器仍将其视为对象。

将对象创建为实例,并创建诸如foo = Foo()之类的语句,foo是从object类继承的对象。

>>> isinstance(foo, object)
True

此类提供对象需要的所有方法,例如__new__()__int__()newinit)。简而言之,前者用于创建类的新实例,后者在实例创建后调用,并用于初始化值,就像使用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中,该类本身或任何其他实例都不会具有它。 这称为Instance variable and class variable

希望这对您来说很有意义。

TL; DR

在Python中,解释器将所有内容(类定义,functions,模块等)都视为对象。因此,“一切”都是一个实例。

答案 1 :(得分:1)

  

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

     

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

     
    

实例化类的Python语法与函数相同     呼叫

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

也请阅读之前的句子:

  

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

因此,一个类的实例是一个以该类为类型的对象。

  

据此,我推断“实例”在执行时存在,并且   

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

  

执行type(b)时,这是   类int()。

不太。

当调用int()时,这里的int实例开始存在。 1 这个 process 是所谓的“实例化”和结果(由此实例返回)呼叫,在此示例中,然后分配给b的是int的“实例”。

  

但是我读了stack overflow answer

     
    

Instance是一个变量,用于保存对象的内存地址。

  

哦,那不是很正确。实例就是对象本身(如果需要,该内存地址的值)。多个变量可以绑定到同一对象(因此绑定到同一实例)。甚至还有一家运营商正在测试:is

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

这个词使我有些困惑。所以当我分配一个   变量在执行时创建了“实例”?

否,那么实例被绑定到该变量。在Python中,将变量视为“值的名称”。因此,将对象绑定到变​​量意味着给该对象指定名称。如上所述,一个对象可以具有多个名称。

您可以在不将实例分配给任何变量的情况下使用实例,即无需命名实例,例如通过将其传递给函数:

>>> print(int())
0
  

最后,此explanation in 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概念之前,习惯将纯对象用作其他对象的模板。 (后一种方法称为“ prototype based面向对象”或“基于原型的继承”。相反,大多数其他面向对象的语言(包括Python)都使用基于类的面向对象/基于类的继承。不确定带有class关键字的现代ECMAScript属于哪个类别。)

  

有人真的可以提供实例的明确定义吗?

就像我进一步写道: 类的实例是具有该类作为其类型对象

因此,“实例”始终是“实例 of ”。这也回答了标题中问题的语言学观点

  

我何时应该称其为“实例”?

当您想将其称为“实例 of ”(通常为类)时,应将其称为“ instance”。


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

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

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

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

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