我一直在阅读有关使用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");
动物对象允许腿的数量和声音 动物根据对象的每个实例进行设置。在这种情况下, 这三个实例(狮子,猫和狗)的腿数相同, 但发出不同的声音。
实际上有人可以提供实例退出的清晰定义吗?
答案 0 :(得分:1)
通常在OOP中
类和对象是面向对象的两个主要方面 编程。一个类创建一个新的类型,其中对象是 班级。
如here所述。
因此,每次创建对象时,它就称为实例。
Python在这个概念上没有区别,但是与其他语言(例如Java)略有不同。
实际上,在Python中,一切都是对象,甚至是类本身。
以下是其工作原理的简要说明:
考虑以下代码段:
>>> class Foo:
... pass
...
>>> type(Foo)
<type 'type'>
>>>
类Foo
的类型为type
,它是Python中所有classes
的元类
(不过,“旧”类和“新”类之间有区别,更多的是here,here和here)。
类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
中,该类本身或任何其他实例都不会具有它。
这称为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不需要这样做。因此,应将其视为实现细节,并且程序逻辑永远不应依赖于此。 (不过,您的性能优化可能会依赖它。)