1

(关于 Python 3.2)

我试图按照以下方式发表声明:

在 Python 中,对象是...

根据文档(http://docs.python.org/py3k/reference/datamodel.html#objects-values-and-types):

每个对象都有一个标识、一个类型和一个值

但是属性在哪里呢?如果我做了a = 3; print(a.__class__)我得到的事情,<class 'int'> 我假设这是对象a引用的类型,这意味着“类型”是对象的“属性”。所以从这个意义上说,我们可以说一个对象拥有的一组足够的“事物”将是它的身份、价值和属性。但是,查看 using 的属性dir(a),我看不到任何类似身份的东西(即使我知道该id()函数会告诉我该信息)。

所以我的问题是,以下任何最小语句是否足以描述 Python 对象的概念?

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

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

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

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

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

4

3 回答 3

2

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

我会这样说:

在 Python 中,一切都是对象。

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

然后,您应该给出一些人们可能不希望成为对象的事物的示例,例如函数。

可以在Dive Into Python中找到关于“什么是对象”的段落:

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

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

于 2012-04-05T01:34:41.400 回答
1

但是属性在哪里呢?

(某种组合)特定对象的属性记录并确定其值。

值、类型和身份这三个都是抽象概念,只能通过示例才能真正理解。考虑:

>>> a = (1, 2)
>>> b = (1, 2)
>>> c = a
>>> d = (3, 4)
>>> e = 2

你无疑明白a,bc都是相等的,但只有 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的虚部都为零)。所以,an 的值int就是它的分子。

但是“价值”是抽象的东西——它对人类来说是有意义的,计算机必须把它提炼一点。与 type 类似——“这是什么类型的东西?” 是人类直接理解的东西;计算机没有,但 Python 使用类来实现它——因此,

>>> type('')
<class 'str'>
>>> type(2)
<class 'int'>

你问“这是什么类型的东西?”,它给了你它的类。类型存储为属性,但这只是因为 Python 将对象的类型视为其值的(潜在)一部分。身份不是值的一部分(尽管在某些情况下,它们可以是等价的),因此它没有记录在属性中 - 它存储在内部机制中,当你说 . 时,它可以让 Python 找到你想要的对象a

于 2012-04-05T02:14:21.293 回答
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.

这对我来说很有意义,但可能对每个人都没有意义。

于 2012-04-04T23:35:56.970 回答