|
4 | 4 |
|
5 | 5 | #类(1)
|
6 | 6 |
|
7 |
| -类,这个词如果是你第一次听到,把它作为一个单独的名词,总感觉怪怪的,因为在汉语体系中,很常见的是说“鸟类”、“人类”等词语,而单独说“类”,总感觉前面缺点修饰成分。其实,它对应的是英文单词class,“类”是这个class翻译过来的,你就把它作为一个翻译术语吧。 |
| 7 | +类,这个词如果你第一次听到,把它作为一个单独的名词,会感觉怪怪的,因为在汉语中,常见的是说“鸟类”、“人类”等词语,而单独说“类”,总感觉前面缺点修饰成分。其实,它对应的是英文单词class,“类”是这个class翻译过来的,你就把它作为一个翻译术语吧。 |
8 | 8 |
|
9 | 9 | 除了“类”这个术语,从现在开始,还要经常提到一个OOP,即面向对象编程(或者“面向对象程序设计”)。
|
10 | 10 |
|
11 |
| -为了理解类和OOP,需要对一些枯燥的名词有了解。 |
| 11 | +为了理解类和OOP,需要对一些枯燥的名词术语有了解。 |
| 12 | + |
| 13 | +>“行百里路者半九十”,如果读者坚持阅读到本书的这个章节,已经对Python有了初步感受,而“类”就是能够让你在Python学习进程中再上台阶的标志。所以,一定要硬着头皮耐心地继续学下去。 |
12 | 14 |
|
13 | 15 | ##术语
|
14 | 16 |
|
15 |
| -必须了解这些术语的基本含义,因为后面经常用到。下面的术语定义均来自维基百科。 |
| 17 | +所谓“术语”,可以粗浅地理解为某个领域的“行话”,比如在物理学里面,有专门定义的“质量”、“位移”、“速度”等,这些术语有的跟日常生活中的俗称名字貌似一样,但是所指有所不同。 |
| 18 | + |
| 19 | +“术语”的主要特征是具有一定的稳定性,并且严谨、简明,不是流行语。在谈到OOP的时候,会遇到一些术语,需要先明确它们的含义。 |
| 20 | + |
| 21 | +本节没有特别声明的术语定义均来自《维基百科》。 |
16 | 22 |
|
17 | 23 | ###问题空间
|
18 | 24 |
|
|
36 | 42 |
|
37 | 43 | 把object翻译为“对象”,是比较抽象的。因此,有人认为,不如翻译为“物件”更好。因为“物件”让人感到一种具体的东西。
|
38 | 44 |
|
39 |
| -这种看法在某些语言中是非常适合的。但是,在Python中,则无所谓,不管怎样,python中的一切都是对象,不管是字符串、函数、模块还是类,都是对象。“万物皆对象”。 |
| 45 | +我们不去追究翻译的名称,因为这是专家们的事情。我们需要知道的是“Python中的一切都是对象”,不管是字符串、函数、模块还是类,都是对象。“万物皆对象”。 |
40 | 46 |
|
41 |
| -都是对象有什么优势吗?太有了。这说明python天生就是OOP的。也说明,python中的所有东西,都能够进行拼凑组合应用,因为对象就是可以拼凑组合应用的。 |
| 47 | +都是对象有什么优势吗?太有了。这说明Python天生就是OOP的。 |
42 | 48 |
|
43 | 49 | 对于对象这个东西,OOP大师Grandy Booch的定义,应该是权威的,相关定义的内容包括:
|
44 | 50 |
|
|
47 | 53 | - **行为(behavior)**:是指一个对象如何影响外界及被外界影响,表现为对象自身状态的改变和信息的传递。
|
48 | 54 | - **标识(identity)**:是指一个对象所具有的区别于所有其它对象的属性。(本质上指内存中所创建的对象的地址)
|
49 | 55 |
|
50 |
| -大师的话的确有水平,听起来非常高深。不过,初学者可能理解起来就有点麻烦了。我就把大师的话化简一下,但是化简了之后可能在严谨性上就不足了,我想对于初学者来讲,应该是影响不很大的。随着学习和时间的深入,就更能理解大师的严谨描述了。 |
| 56 | +大师的话的确有水平,听起来非常高深。不过,初学者可能理解起来就有点麻烦了。 |
| 57 | + |
| 58 | +于是就需要“述而不作”的我了,我的任务就是就把大师的话化简,虽然化简了之后可能在严谨性上就不足了,但对于初学者来讲,应该是影响不很大的。随着学习和时间的深入,就更能理解大师的严谨描述了。那时候应当抛弃本书,去阅读大师的作品。 |
51 | 59 |
|
52 | 60 | 简化之,对象应该具有属性(就是上面的状态,因为属性更常用)、方法(就是上面的行为,方法更常被使用)和标识。因为标识是内存中自动完成的,所以,平时不用怎么管理它。主要就是属性和方法。
|
53 | 61 |
|
54 | 62 | 为了体现“深入浅出”的道理,还是讲故事吧。
|
55 | 63 |
|
56 |
| -既然万物都是对象,那么,某个具体的人也是对象,这是当然的事情。假设这个具体的人就是德艺双馨的苍老师,她是一个对象。这个苍老师具有哪些特征呢?我错了,写到这里发现不能用苍老师为对象的例子,因为容易让读者不专心学习了。我换一个吧,以某个王美女为对象说明(这个王美女完全是虚构的,请不要对号入座,更不要想入非非,如果雷同,纯属巧合)。 |
| 64 | +既然万物都是对象,那么,某个具体的人也是对象,这是当然的事情。假设这个具体的人就是德艺双馨的苍老师,她是一个对象。这个苍老师具有哪些特征呢?我错了,写到这里发现不能用苍老师为对象的例子,因为容易让读者不专心学习了。我换一个吧,选定的对象就是某个王美女(这个王美女完全是虚构的,请不要对号入座,更不要想入非非,如果雷同,纯属巧合,想入非非的后果自行担负)。 |
57 | 65 |
|
58 | 66 | 王美女这个对象具有某些特征,眼睛,大;腿,长;皮肤,白。当然,既然是美女,肯定还有别的显明特征,读者可以自己假设去。如果用“对象”的术语来说明,就说这些特征都是她的属性。也就是说**属性是一个对象做具有的特征,或曰:是什么。**。
|
59 | 67 |
|
|
93 | 101 |
|
94 | 102 | >正如面向过程程序设计使得结构化程序设计的技术得以提升,现代的面向对象程序设计方法使得对设计模式的用途、契约式设计和建模语言(如UML)技术也得到了一定提升。
|
95 | 103 |
|
96 |
| -列位看官,当您阅读到这句话的时候,我就姑且认为您已经对面向对象有了一个模糊的认识了。那么,类和OOP有什么关系呢? |
| 104 | +至此,如果读者把前面的文字逐句读过,没有跳跃,则姑且认为你已经对“面向对象”有了一个模糊的认识了。那么,类和OOP有什么关系呢? |
97 | 105 |
|
98 | 106 | ###类
|
99 | 107 |
|
|
105 | 113 |
|
106 | 114 | >支持类的编程语言在支持与类相关的各种特性方面都多多少少有一些微妙的差异。大多数都支持不同形式的类继承。许多语言还支持提供封装性的特性,比如访问修饰符。类的出现,为面向对象编程的三个最重要的特性(封装性,继承性,多态性),提供了实现的手段。
|
107 | 115 |
|
108 |
| -看到这里,看官或许有一个认识,要OOP编程,就得用到类。可以这么说,虽然不是很严格。但是,反过来就不能说了。不是说用了类就一定是OOP。 |
| 116 | +看到这里,读者或许有一个认识,要OOP编程就得用到类。可以这么说,虽然不是很严格。但是,反过来就不能说了。不是说用了类就一定是OOP。 |
109 | 117 |
|
110 | 118 | ##编写类
|
111 | 119 |
|
|
118 | 126 | class 美女: #用class来声明,后面定义的是一个类
|
119 | 127 | pass
|
120 | 128 |
|
121 |
| -好,现在就从这里开始,编写一个类,不过这次我们暂时不用python,而是用伪代码,当然,这个代码跟python相去甚远。如下: |
| 129 | +从这里开始编写一个类,不过这次我们暂时不用Python,而是用貌似伪代码,当然,这个代码跟Python相去甚远。如下: |
122 | 130 |
|
123 | 131 | class 美女:
|
124 | 132 | 胸围 = 90
|
|
128 | 136 | 唱歌()
|
129 | 137 | 做饭()
|
130 | 138 |
|
131 |
| -定义了一个名称为“美女”的类,其中我约定,没有括号的是属性,带有括号的是方法。这个类仅仅是对美女的通常抽象,并不是某个具体美女. |
| 139 | +定义了一个名称为“美女”的类,并约定,没有括号的是属性,带有括号的是方法。 |
| 140 | + |
| 141 | +这个类仅仅是对美女的通常抽象,并不是某个具体美女。 |
132 | 142 |
|
133 | 143 | 对于一个具体的美女,比如前面提到的苍老师或者王美女,她们都是上面所定义的“美女”那个类的具体化,这在编程中称为“美女类”的实例。
|
134 | 144 |
|
135 | 145 | 王美女 = 美女()
|
136 | 146 |
|
137 |
| -我用这样一种表达方式,就是将“美女类”实例化了,对“王美女”这个实例,就可以具体化一些属性,比如胸围;还可以具体实施一些方法,比如做饭。通常可以用这样一种方式表示: |
| 147 | +用这样一种表达方式,就是将“美女类”实例化了,或者说创建了一个实例“王美女”。对“王美女”这个实例,就可以具体化一些属性,比如胸围;还可以具体实施一些方法,比如做饭。通常可以用这样一种方式表示: |
138 | 148 |
|
139 | 149 | a = 王美女.胸围
|
140 | 150 |
|
141 |
| -用点号`.`的方式,表示王美女胸围的属性,得到的变量a就是90.另外,还可以通过这种方式给属性赋值,比如 |
| 151 | +用点号`.`的方式,表示王美女胸围的属性,得到的值就是90。 |
| 152 | + |
| 153 | +另外,还可以通过这种方式给属性赋值,比如 |
142 | 154 |
|
143 | 155 | 王美女.皮肤 = black
|
144 | 156 |
|
145 |
| -这样,这个实例(王美女)的皮肤就是黑色的了。 |
| 157 | +这样,这个王美女(实例)的皮肤(属性)就是黑色(值)的了。 |
146 | 158 |
|
147 | 159 | 通过实例,也可以访问某个方法,比如:
|
148 | 160 |
|
|
152 | 164 |
|
153 | 165 | 至此,你是否对类和实例,类的属性和方法有初步理解了呢?如果没有理解,请用苍老师实例化美女类,你一定能理解的。
|
154 | 166 |
|
| 167 | +当然,对类的认识不能仅仅停留在此,还要真刀真枪地写代码。 |
| 168 | + |
155 | 169 | ------
|
156 | 170 |
|
157 | 171 | [总目录](./index.md) | [上节:函数练习](./205.md) | [下节:类(2)](./207.md)
|
|
0 commit comments