|
| 1 | +# 2.1 引言 |
| 2 | + |
| 3 | +> 来源:[2.1 Introduction](http://www-inst.eecs.berkeley.edu/~cs61a/sp12/book/objects.html#introduction) |
| 4 | +
|
| 5 | +> 译者:[飞龙](https://github.com/wizardforcel) |
| 6 | +
|
| 7 | +> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) |
| 8 | +
|
| 9 | +在第一章中,我们专注于计算过程,以及程序设计中函数的作用。我们看到了如何使用原始数据(数值)和原始操作(算术运算),如何通过组合和控制来形式复合函数,以及如何通过给予过程名称来创建函数抽象。我们也看到了高阶函数通过操作通用计算方法来提升语言的威力。这是编程的本质。 |
| 10 | + |
| 11 | +这一章会专注于数据。数据允许我们通过使用已经获得的计算工具,表示和操作与世界有关的信息。脱离数据结构的编程可能会满足于探索数学特性,但是真实世界的情况,比如文档、关系、城市和气候模式,都拥有复杂的结构,它最好使用符合数据类型来表现。归功于互联网的高速发展,关于世界的大量结构信息可以免费从网上获得。 |
| 12 | + |
| 13 | +## 2.1.1 对象隐喻 |
| 14 | + |
| 15 | +在这门课的开始,我们区分了函数和数据:函数执行操作,而数据被操作。当我们在数据中包含函数值时,我们承认数据也拥有行为。函数可以像数据一样被操作,但是也可以被调用来执行计算。 |
| 16 | + |
| 17 | +在这门课中,对象作为我们对数据值的核心编程隐喻,它同样拥有行为。对象表示信息,但是同时和它们所表示的抽象概念行为一致。对象如何和其它对象交互的逻辑,和编码对象值的信息绑定在一起。在打印对象时,它直到如何以字母和数字把自己拼写出来。如果一个对象由几部分组成,它知道如何按照要求展示这些部分。对象即是信息也是过程,它们绑定在一起来展示复杂事物的属性、交互和行为。 |
| 18 | + |
| 19 | +Python 中所实现的对象隐喻具有特定的对象语法和相关的术语,我们会使用示例来介绍。日期(`date`)就是一种简单对象。 |
| 20 | + |
| 21 | +```py |
| 22 | +>>> from datetime import date |
| 23 | +``` |
| 24 | + |
| 25 | +`date`的名字绑定到了一个类上面。类表示一类对象。独立的日期叫做这个类的实例,它们可以通过像函数那样在参数上调用这个类来构造,这些参数描述了实例。 |
| 26 | + |
| 27 | + |
| 28 | +```py |
| 29 | +>>> today = date(2011, 9, 12) |
| 30 | +``` |
| 31 | + |
| 32 | +虽然`today`从原始数值中构造,它的行为就像日期那样。例如,将它与另一个日期相减会得到时间差,它可以通过调用`str`来展示为一行文本: |
| 33 | + |
| 34 | +```py |
| 35 | +>>> str(date(2011, 12, 2) - today) |
| 36 | +'81 days, 0:00:00' |
| 37 | +``` |
| 38 | + |
| 39 | +对象拥有属性,它们是带有名字的值,也是对象的一部分。Python 中,我们使用点运算符来访问对象属性: |
| 40 | + |
| 41 | +``` |
| 42 | +<expression> . <name> |
| 43 | +``` |
| 44 | + |
| 45 | +上面的`<expression>`求值为对象,`<name>`是对象的某个属性名称。 |
| 46 | + |
| 47 | +不像我们之前见过的名称,这些属性名称在一般的环境中不可用。反之,属性名称是点运算符之前的对象实例的特定部分。 |
| 48 | + |
| 49 | +```py |
| 50 | +>>> today.year |
| 51 | +2011 |
| 52 | +``` |
| 53 | + |
| 54 | +对象也拥有方法,它是值为函数的属性。在隐喻上,对象“知道”如何执行这些方法。方法从它们的参数和对象中计算出它们的结果。例如,`today`的`strftime`方法接受一个指定如何展示日期的参数(例如`%A`表示星期中天应该以全称拼写)。 |
| 55 | + |
| 56 | +```py |
| 57 | +>>> today.strftime('%A, %B %d') |
| 58 | +'Monday, September 12' |
| 59 | +``` |
| 60 | + |
| 61 | +计算`strftime`的返回值需要两个输入:描述输出格式的字符串,以及绑定到`today`的日期信息。这个方法使用日期特定的逻辑来产生结果。我们从不会说 2011 年九月十二日是星期一,但是知道一个人工作日的日期的一部分。通过绑定行为和信息,Python 对象提供了可靠、独立的日期抽象。 |
| 62 | + |
| 63 | +点运算符在 Python 中提供了另一种组合表达式。点运算符拥有定义好的求值过程。但是,点运算符如何求值的精确解释,要等到我们引入面向对象编程的完整范式,在几节之后。 |
| 64 | + |
| 65 | +即使我们还不能精确描述对象如何工作,我们还是可以开始将数据看做对象,因为 Python 中万物皆对象。 |
| 66 | + |
| 67 | +## 2.1.2 原始数据类型 |
| 68 | + |
| 69 | +Python 中每个对象都拥有一个类型。`type`函数可以让我们查看对象的类型。 |
| 70 | + |
| 71 | +```py |
| 72 | +>>> type(today) |
| 73 | +<class 'datetime.date'> |
| 74 | +``` |
| 75 | + |
| 76 | +目前为止,我们学过的唯一一种对象就是数值、函数、布尔值和现在的日期。我们也碰到了集合和字符串,我们需要更深入地学习它们。有许多其它的对象类型 -- 声音、图像、位置、数据连接等等 -- 它们的多数可以通过组合和抽象的手段来定义,我们在这一章会研究它们。Python 只有一小部分内建于语言的原始数据类型。 |
| 77 | + |
| 78 | +原始数据类型具有以下特性: |
| 79 | + |
| 80 | +1. 原始表达式可以计算这些类型的对象,叫做字面值。 |
| 81 | +2. 内建的函数、运算符和方法可以操作这些对象。 |
| 82 | + |
| 83 | +像我们看到的那样,数值是原始类型,数字字面值求值为数值,算术运算符操作数值对象: |
| 84 | + |
| 85 | +```py |
| 86 | +>>> 12 + 3000000000000000000000000 |
| 87 | +3000000000000000000000012 |
| 88 | +``` |
| 89 | + |
| 90 | +实际上,Python 包含了三个原始数值类型:整数(`int`)、实数(`float`)和复数(`complex`)。 |
| 91 | + |
| 92 | +```py |
| 93 | +>>> type(2) |
| 94 | +<class 'int'> |
| 95 | +>>> type(1.5) |
| 96 | +<class 'float'> |
| 97 | +>>> type(1+1j) |
| 98 | +<class 'complex'> |
| 99 | +``` |
| 100 | + |
| 101 | +名称`float`来源于实数在 Python 中表示的方式:“浮点”表示。虽然数值表示的细节不是这门课的话题,一些`int`和`float`对象的高层差异仍然很重要。特别是,`int`对象只能表示整数,但是表示得更精确,不带有任何近似。另一方面,`float`对象可以表示很大范围内的分数,但是不能表示所有有理数。然而,浮点对象通常用于近似表示实数和有理数,舍入到某个有效数字的数值。 |
| 102 | + |
| 103 | +**扩展阅读。**下面的章节介绍了更多的 Python 原始数据类型,专注于它们在创建使用数据抽象中的作用。Dive Into Python 3 中的[原始数据类型](http://diveintopython3.ep.io/native-datatypes.html)一章提供了所有 Python 数据类型的实用概览,以及如何高效使用它们,还包含了许多使用示例和实践提示。你现在并不需要阅读它,但是要考虑将它作为宝贵的参考。 |
0 commit comments