如何描述Python对象,以及属性、标识、类型和值之间的关系



(关于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对象的概念?

  1. 在Python中,对象具有属性,其中始终包括标识、类型和值。

  2. 在Python中,对象具有标识和属性,其中始终包括其类型和值。

  3. 在Python中,对象有一个标识、值和属性,其中总是包括其类型等。

如果没有,有人能给我一个定义,传达关系属性、身份、类型和对象的值吗?

(我更希望数字1是真的。:p)

虽然你可以通过属性访问对象的类型,但它的类型不仅仅是一个属性——类型定义了对象在拥有任何属性之前是如何创建的。仅凭这一点,这些语句都不足以描述Python对象。

我会这样说:

在Python中,一切都是一个对象。

对象是一个信息块,它有一个类型,定义它的创建以及它如何与其他对象交互,一个身份,将它与所有其他对象区分开来,还有一个值,即块中的信息。属性是与给定对象相关联的其他对象,包括其类型的对象。

然后,您应该给出一些人们可能不希望成为对象的东西的例子,比如函数。

关于";什么是物体;可以在Dive Into Python中找到:

Python中的所有东西都是一个对象,几乎所有东西都有属性和方法。所有函数都有一个内置属性__doc__,它返回函数源代码中定义的文档字符串。sys模块是一个对象,它(除其他外)具有一个称为path的属性。等等

尽管如此,这还是引出了一个问题。什么是物体?不同的编程语言以不同的方式定义"对象"。在某些情况下,这意味着所有对象都必须具有属性和方法;在其他情况下,这意味着所有对象都是可子类的。在Python中,定义比较松散;有些对象既没有属性也没有方法(第3章对此进行了详细介绍),并且并非所有对象都是可子类的(第5章对此进行详细介绍)。但从某种意义上说,一切都是一个对象,它可以被分配给一个变量,也可以作为一个参数传递给一个函数(第4章对此进行了详细介绍)。

我认为您的术语混淆了。

身份

对象的标识只是在其生命周期中唯一标识该对象的值。因此,保证了id(1)不同于id(2)

类型

对象的类型告诉你更多的东西;它告诉您可以对该对象使用哪些操作,以及可以在该对象中存储哪些可能的值。有两种类型:内置类型和用户定义类型。内置类型有intstring等。用户定义的是您自己定义的类。

价值

这是存储在类型中的内容。

属性

这些是可以从现有对象中获取的附加变量。

示例:

>>> 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

毫无疑问,您知道abc都是相等的,但只有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可以找到你想要的对象。

最新更新