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

时间:2012-04-04 23:17:18

标签: python object attributes python-3.x

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

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

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

  4.   
  5. 在Python中,对象具有标识,值和属性,其中包括其类型等。

  6.   

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

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

3 个答案:

答案 0 :(得分:2)

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

我会这样说:

  

在Python中,一切都是对象。

     

对象是一个信息块,它有一个类型,它定义了它的创建以及它与其他对象的交互方式,一个标识区别于所有其他对象的标识,以及一个值,即块中的信息。属性是与给定对象关联的其他对象,包括其类型的对象。

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

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

  

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

     

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

答案 1 :(得分:1)

我认为你的术语已经混淆了。

身份

对象的标识只是一个在其生命周期内唯一标识该对象的值。因此,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.

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

答案 2 :(得分:1)

  

但属性属于哪个?

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

价值,类型和身份三者都是抽象概念,只能通过实例来理解。考虑一下:

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

毫无疑问,您明白abc都是相同的,但只有a和c是同一个对象。也就是说,所有三个都具有相同的值,并且a和c具有相同的身份。 da(元组)具有相同类型的对象,但具有不同的值; 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}}。