修改理由:

笔误

相关信息:


此投稿已在 6年前 合并。

内容修改:

红色背景 为原始内容

绿色背景 为新增或者修改的内容

OldNewDifferences
1 
2 面对对象编程
 1面向对象编程
32----------
43
54直到目前为止,我们已经使用函数、块语句来操作我们的数据。这叫做 *面向过程* 的方式进行编程。然而还有另外一种方式来组织你的程序:把数据和函数结合起来,并将其置入一种叫做对象的东西。这就叫做 *面向对象* 编程范式。在大多数情况下,你可以使用面向过程的编程,但是当写大型程序或者遇到了一些更加适合这种方法的时候,你可以使用基于对象的编程技术。
 
1716域有两种类型 - 他们可以属于每一个类的实例(也就是对象),也可以属于类本身。他们被分别称作实例变量和类的变量。
1817
1918使用 `class` 关键字来创建一个类。这个类的域和方法被列在一个代码块中。
20 
 19
2120关于 `self`
2221----------
2322
 
3332
3433这也意味着如果你有一个不声明任何形式参数的方法,却仍然有一个入口参数 —— `self` 。
3534
36 
 35
3736
3837
3938-------
 
6463之后,我们使用类的名字和一对括号创建了一个类的对象(实例)。(我们将在下一节学习 [更多的例子](https://python.swaroopch.com/oop.html#init) 。我们通过简单地打印变量 `p` 的方法确认这个变量类型。结果证明这是 `__main__` 模块中 `Person`类的一个对象。
6564
6665注意这个对象在内存中的地址也被显示出来。这个地址可能在你的电脑上有一个不同的值,这是由于 Python 只要找到空闲的内存空间就会在此处存放这个对象。
67 
 66
6867
6968方法
7069-------
 
9594
9695现在我们具体的看一下 `self` 是如何工作的。注意到在 `say_hi` 方法中没有取得任何一个参数,却在方法定义的时候仍然有一个 `self` 参数。
9796
98 
 97
9998
10099`__init__` 方法 
101100---------------------
 
140139正如 `say_hi` 方法所示的,现在我们在我们的方法之中可以使用 `self.name` 这个域了。
141140
142141
143 
 142
144143类和对象中的变量
145144--------------------------
146145
 
244243
245244我们使用一个 [装饰器](https://python.swaroopch.com/more.html#decorator) 来标记 `how_many` 方法,并将其作为一个类方法。
246245
247 
 246
248247
249248装饰器可以被想象成为一个快捷的方式去调用一个包裹函数(一个包裹着另外一个函数的函数,因此可以在内部函数调用之前及之后做一些事情),因此使用 `@classmethod` 装饰器和如下调用等价:
250249
 
270269> 在 Python 中,所有的成员(包括数据成员)都是 *公共的* ,所有的方法都是 *虚拟*的。
271270
272271
273 
 272
274273
275274继承
276275-----------
 
289288
290289 `SchoolMember` 类在这种情况下被称为基本类或者超类。而 `Teacher` 和 `Student` 类被成为派生类或者子类。
291290
292 
 291
293292我们来看看这个例子(保存为 `oop_subclass.py` ):
294293
295294```
 
366365
367366`end` 参数在父类 `tell()` 方法中调用的 `print` 函数中被使用,以使得打印完一句话之后,下一次打印紧接在第一句话之后,而不换行。这个技巧可以使得 `print` 函数在输出结束时不打印 `\n` 符号(换行)。
368367
369 
 368
370369
371370总结
372371-------