(关于Python 3.2)
我试图按照以下方式发表声明:
在Python中,对象是......
根据文件(http://docs.python.org/py3k/reference/datamodel.html#objects-values-and-types):
每个对象都有一个标识,一个类型和一个值
但属性属于哪个?如果我执行a = 3; print(a.__class__)
之类的操作,我会得到<class 'int'>
我认为这是对象a
引用的类型,这意味着“type”是对象的“属性”。所以从这个意义上讲,我们可以说一个对象具有足够的“事物”就是它的身份,价值和属性。但是,通过查看使用dir(a)
的属性,我看不到任何类似身份的内容(即使我知道id()
函数会告诉我该信息)。
所以我的问题是以下任何一个充分描述Python对象概念的最小语句?
在Python中,对象具有属性,其中始终包含标识,类型和值。
在Python中,对象具有标识和属性,其中始终包含其类型和值。
- 醇>
在Python中,对象具有标识,值和属性,其中包括其类型等。
如果没有,有人可以给我一个定义来传达对象的关系属性,身份,类型和价值吗?
(我希望数字1是真的。:P)
答案 0 :(得分:2)
虽然您可以通过属性访问对象的类型,但它的类型不仅仅是一个属性 - 该类型定义了对象在具有任何属性之前的创建方式。仅凭这一事实,这些语句都不足以描述Python对象。
我会这样说:
在Python中,一切都是对象。
对象是一个信息块,它有一个类型,它定义了它的创建以及它与其他对象的交互方式,一个标识区别于所有其他对象的标识,以及一个值,即块中的信息。属性是与给定对象关联的其他对象,包括其类型的对象。
然后,您应该提供一些人们可能不希望成为对象的事例,例如函数。
可以在Dive Into Python中找到关于“什么是对象”的段落:
Python中的所有东西都是一个对象,几乎所有东西都有属性和方法。所有函数都有一个内置属性
__doc__
,它返回函数源代码中定义的doc字符串。sys
模块是一个对象,其中包含一个名为path
的属性(除其他外)。等等。然而,这引出了一个问题。什么是对象?不同的编程语言以不同的方式定义“对象”。在某些情况下,这意味着所有对象必须具有属性和方法;在其他情况下,这意味着所有对象都是可子类化的。在Python中,定义更宽松;一些对象既没有属性也没有方法(第3章中有更多内容),并且并非所有对象都是可子类化的(在第5章中有更多内容)。但是,从某种意义上说,一切都是一个对象,它可以被赋值给一个变量,或作为一个参数传递给一个函数(详见第4章)。
答案 1 :(得分:1)
我认为你的术语已经混淆了。
对象的标识只是一个在其生命周期内唯一标识该对象的值。因此,id(1)
保证与id(2)
不同。
对象的类型告诉你更多的东西;它告诉您可以对该对象使用哪些操作,以及可以在该对象中存储哪些可能的值。有两种类型:内置和用户定义。内置类型为int
,string
等。用户定义的是您自己定义的类。
这是存储在类型中的内容。
这些是您可以从现有对象获得的其他变量。
>>> s = "foo" # s is a new variable
>>> id(s) # it has a unique identifier
4299579536
>>> type(s) # it has a type ("str")
<type 'str'>
>>> s # it has a value ("foo")
'foo'
>>> s.__class__ # it has an attribute called __class__ that has the following value:
<type 'str'>
所以你的所有三个陈述都是正确的,但#3对我来说听起来“最正确”。我也听说过
In Python, an object is a dict.
这对我来说很有意义,但对每个人都没有意义。
答案 2 :(得分:1)
但属性属于哪个?
(某些组合)特定对象的属性记录并确定其值。
价值,类型和身份三者都是抽象概念,只能通过实例来理解。考虑一下:
>>> a = (1, 2)
>>> b = (1, 2)
>>> c = a
>>> d = (3, 4)
>>> e = 2
毫无疑问,您明白a
,b
和c
都是相同的,但只有a和c是同一个对象。也就是说,所有三个都具有相同的值,并且a和c具有相同的身份。 d
与a
(元组)具有相同类型的对象,但具有不同的值; e是完全不同的类型(int)。
e
的值对于人类来说是微不足道的(因为int文字拼写为众所周知的符号),但Python会跟踪它的几个属性:
>>> e.numerator
2
>>> e.denominator
1
>>> e.real
2
>>> e.imag
0
这些一起确定了值 - 虽然是int
,但是保证分母为1,虚部为0(实际上,Rational内置的所有值都为零想象的部分)。所以,int
的值是它的分子。
但“价值”是一种抽象的东西 - 它对人类有意义,计算机必须更多地提炼它。与类型相似 - “这是什么类型的东西?”是人类直接理解的东西;计算机没有,但Python使用类来实现它 - 因此,
>>> type('')
<class 'str'>
>>> type(2)
<class 'int'>
你问“这是什么类型的东西?”,它会让你回到它的班级。类型存储为属性,但仅限于因为Python将对象的类型视为其值的(潜在)部分。身份不是价值的一部分(虽然在某些情况下,它们可以是等价的),因此它不会记录在属性中 - 它存储在内部机器中,当您说{{{{ 1}}。