1 轻松看对象
(1)类
在这里,我们用关键字class来定义一个类。类的名字就是鸟(Bird)。括号 里有一个关键词object,也就是“东西”的意思,即某一个个体。
![](https://img.haomeiwen.com/i19949423/f3eb7f46dc8c1eb0.png)
我们定义了两个量,一个用于说明鸟类有羽毛(feather),另一个用于说明鸟类的繁殖 方式(reproduction),这两个量称为类的属性(attribute)。
![](https://img.haomeiwen.com/i19949423/75ba8a68129866d3.png)
我们给鸟类新增一个方法属性,就是表示鸟叫的方法chirp()。方法chirp()看 起来很像一个函数。它的第一个参数是self,是为了在方法内部引用对象自身,则打印出新的一个属性(sound)。
(2)对象
比如我设一个summer,这个是一个小鸟,这个小鸟属于鸟类。则
![](https://img.haomeiwen.com/i19949423/4e94aba49d7f7db9.png)
现在,我们就可 以使用鸟类中已经写好的代码了。作为对象的summer将拥有鸟类的属性和方法。对 属性的引用是通过对象.属性(object.attribute)的形式实现的。比如说:
![](https://img.haomeiwen.com/i19949423/96286aaac0fa43bb.png)
我们还可以再加一个属于鸟的属性。
![](https://img.haomeiwen.com/i19949423/500719386192c6f7.png)
如果不同的鸟具有它特殊的颜色,那么我们加一个属于它的特殊属性。
![](https://img.haomeiwen.com/i19949423/33264413e5810dd6.png)
对于类的 __init__()方法,Python会在每次创建对象时自动调用。因此,我们可以在 __init__()方法内部来初始化对象属性:
![](https://img.haomeiwen.com/i19949423/21604198579e9e17.png)
除了操作对象属性外,self参数还有另外一个功能,就是能让我们在一个方法 内部调用同一类的其他方法,比如:
![](https://img.haomeiwen.com/i19949423/77744ab8f13f3f4a.png)
2 继承者们
(1)子类:
类别本身还可以进一步细分成子类。比如说,鸟类可以进一步分成鸡、天鹅。 在面向对象编程中,我们通过继承(Inheritance)来表达上述概念。
![](https://img.haomeiwen.com/i19949423/982d5aa5474cea16.png)
(2)属性覆盖:
在继承的过程中,我们可以在子类中增加父类不存在的属性,从而 增强子类的功能。此外,我们还可以在子类中替换父类已经存在了的属性,比如:
![](https://img.haomeiwen.com/i19949423/b1f988778285090e.png)
通过对方法的覆盖,我们可以彻底地改变子类的行为。但有的时候,子类的行 为是父类行为的拓展。这时,我们可以通过super关键字在子类中调用父类中被覆盖 的方法,比如:
![](https://img.haomeiwen.com/i19949423/75c13a8635a79d63.png)
2 那些年,错过的对象
(1)列表对象
我们可以用help()来说明文档,也可以用help添加自己对文档的说明,如:
![](https://img.haomeiwen.com/i19949423/d858968c75c64e95.png)
程序中的pass是Python的一个特殊关键字,用于说明在该语法结构中“什么都 不做”。这个关键字保持了程序结构的完整性。
(2)关于列表(list)的隐藏功能:
![](https://img.haomeiwen.com/i19949423/365c3f4e8714cad7.png)
![](https://img.haomeiwen.com/i19949423/c845447fe005c503.png)
(3)元组与字符串对象
元组与列表一样,都是序列。但元组不能改变更变内容。所以元组只能进行查询操作
![](https://img.haomeiwen.com/i19949423/7d2e5790208509e3.png)
字符串是特殊的元组,因此可以执行元组的方法:
![](https://img.haomeiwen.com/i19949423/3cb28bb70cf825aa.png)
![](https://img.haomeiwen.com/i19949423/2237fc2c0e1eefc4.png)
![](https://img.haomeiwen.com/i19949423/b330e429751047ee.png)
(4)词典对象
词典同样是一个类:
![](https://img.haomeiwen.com/i19949423/350122ddd50b08b6.png)
3 意想不到的对象
(1)循环对象
当一个像for这样的循环语法调用循环对象时,它会在每次循环的时候调用 __next__()方法,直到StopIteration出现。循环接收到这个异常,就会知道循环 已经结束,将停止调用__next__()。
我们用内置函数iter()把一个列表转变为循环对象。这个循环对象将拥有 __next__()方法。我们多次调用__next__()方法,将不断返回列表的值,直到出 现异常:
![](https://img.haomeiwen.com/i19949423/7e554cba3e5b4f78.png)
我们可以借助生成器(generator)来自定义循环对象。生成器的编写方法和 函数定义类似,只是在return的地方改为yield。生成器中可以有多个yield。当生 成器遇到一个yield时,会暂停运行生成器,返回yield后面的值。当再次调用生成 器的时候,会从刚才暂停的地方继续运行,直到下一个yield。生成器自身又构成一 个循环对象,每次循环使用一个yield返回的值。
下面是一个生成器:
![](https://img.haomeiwen.com/i19949423/6ca16f2dc1c03a67.png)
该生成器共有三个yield,如果用作循环对象时,会进行三次循环。
(2)函数对象
前面说过,在Python中,函数也是一种对象。实际上,任何一个有__call__() 特殊方法的对象都被当作是函数。比如下面的例子:
![](https://img.haomeiwen.com/i19949423/61c6fbd37d34d7cb.png)
(3)模块对象
我们直 接引入标准库中的模块time:
![](https://img.haomeiwen.com/i19949423/b8b6d8ddaf0c1959.png)
我们之前用import 语句引入其他文件中定义的函数,实际上就是引入模块对象的属性,比如:
![](https://img.haomeiwen.com/i19949423/62d874083f4b9ac9.png)
(4)异常对象
以在程序中加入异常处理的try结构,捕捉程序中出现的异 常。实际上,我们捕捉到的也是一个对象,比如:
![](https://img.haomeiwen.com/i19949423/e43f976a4df119f6.png)
网友评论