(关于Python 3.2)
我想做一个大致如下的声明:
在Python中,对象是…
根据医生的说法(http://docs.python.org/py3k/reference/datamodel.html#objects-值和类型):
每个对象都有一个标识、一个类型和一个值
但属性在哪里呢?如果我做类似a = 3; print(a.__class__)
的事情,我得到<class 'int'>
,我假设这是a
引用的对象的类型,这意味着";类型";是一个";属性";对象的。因此,从这个意义上说,我们可以说;事物;一个对象将是它的身份、值和属性。然而,通过使用dir(a)
查看a的属性,我看不到任何类似身份的信息(尽管我知道id()
函数会告诉我这些信息)。
因此,我的问题是,以下任何一个最小语句是否足以描述Python对象的概念?
在Python中,对象具有属性,其中始终包括标识、类型和值。
在Python中,对象具有标识和属性,其中始终包括其类型和值。
在Python中,对象有一个标识、值和属性,其中总是包括其类型等。
如果没有,有人能给我一个定义,传达关系属性、身份、类型和对象的值吗?
(我更希望数字1是真的。:p)
虽然你可以通过属性访问对象的类型,但它的类型不仅仅是一个属性——类型定义了对象在拥有任何属性之前是如何创建的。仅凭这一点,这些语句都不足以描述Python对象。
我会这样说:
在Python中,一切都是一个对象。
对象是一个信息块,它有一个类型,定义它的创建以及它如何与其他对象交互,一个身份,将它与所有其他对象区分开来,还有一个值,即块中的信息。属性是与给定对象相关联的其他对象,包括其类型的对象。
然后,您应该给出一些人们可能不希望成为对象的东西的例子,比如函数。
关于";什么是物体;可以在Dive Into Python中找到:
Python中的所有东西都是一个对象,几乎所有东西都有属性和方法。所有函数都有一个内置属性
__doc__
,它返回函数源代码中定义的文档字符串。sys
模块是一个对象,它(除其他外)具有一个称为path
的属性。等等尽管如此,这还是引出了一个问题。什么是物体?不同的编程语言以不同的方式定义"对象"。在某些情况下,这意味着所有对象都必须具有属性和方法;在其他情况下,这意味着所有对象都是可子类的。在Python中,定义比较松散;有些对象既没有属性也没有方法(第3章对此进行了详细介绍),并且并非所有对象都是可子类的(第5章对此进行详细介绍)。但从某种意义上说,一切都是一个对象,它可以被分配给一个变量,也可以作为一个参数传递给一个函数(第4章对此进行了详细介绍)。
我认为您的术语混淆了。
身份
对象的标识只是在其生命周期中唯一标识该对象的值。因此,保证了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.
这对我来说是有意义的,但可能对每个人都没有意义。
但属性在哪里呢?
特定对象的属性的某些组合记录并确定其值。
价值、类型和身份这三个概念都是抽象概念,只有通过例子才能真正理解。考虑:
>>> 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(事实上,所有内置的Ratinals都有一个零虚部)。因此,int
的值就是它的分子。
但"价值"是一种抽象的东西——它对人类来说是有意义的,计算机必须进一步提炼它。与类型类似——"这是什么类型的东西?"是人类直接理解的东西;计算机没有,但Python使用类来实现它——因此,
>>> type('')
<class 'str'>
>>> type(2)
<class 'int'>
你问"这是什么类型的东西?",它会给你它的类。类型被存储为属性,但这只是因为Python认为对象的类型是其值的(潜在的)一部分。标识不是值的一部分(尽管在某些情况下,它们可能是等效的),因此它不会记录在属性中——它存储在内部机制中,当你说a
时,Python可以找到你想要的对象。