您的位置:首页 > 编程语言 > Python开发

【书山有路】Python基础教程 第9章

2017-03-15 09:29 239 查看
这章的主题是“魔法方法、属性和迭代器”。

在Python中,有的名称会在前面和后面都加上两个下划线,比如future,这种拼写表示名字有特殊含义,所以绝对不要在自己的程序中使用这些名字。在Python中,由这些名字所组成的集合所包含的方法称为魔法方法。如果对象实现了这些方法中的某一个,那么这个方法会在特殊情况下(根据名字)被Python调用。

本章会详细讨论一些重要的魔法方法(最重要的是init方法和一些处理对象访问的方法,这些方法允许你创建自己的序列或者是映射)。

构造方法

当一个对象被创建后,会立即调用构造方法。构造方法的名字为init。这个方法也可以添加参数。

Python中还有一个魔法方法叫做del,它是析构方法。在对象要被垃圾回收之前调用。但发生调用的具体时间是不可知的,所以建议读者尽力避免使用del函数。(不幸的是,我很喜欢用del释放资源。。。)

重写一般方法和特殊的构造方法

在子类中添加功能的最基本的方法就是增加方法,也可以重写一些超类的方法来自定义继承的行为。

重写是继承机制中的一个重要的内容,对于构造方法尤其重要。大多数子类不仅要拥有自己的初始化代码,还要拥有超类的初始化代码。如果一个类的构造方法被重写,那么就需要调用超类的构造方法,否则对象可能不会被正确地初始化。

调用未绑定的超类方法

在调用一个实例的方法时,该方法的self参数会被自动绑定到实例上(称为绑定方法)如果直接调用类的方法(比如Bird.init),那么就没有实例会被绑定。这样就可以自由地提供需要的self参数。这样的方法称为未绑定方法。可以通过当前的实例作为self参数提供给未绑定方法。

使用super函数

也可以像下面那样调用父类的构造方法。

class SongBird(Bird):
def __init__(self):
super(SongBird,self).__init__()
self.sound = 'Squawk!'

def sing(self):
print self.sound


即使类继承了多个超类,也只需要调用一次super函数。

成员访问

基本的序列和映射的规则很简单,但如果要实现它们全部功能就需要实现很多魔法方法。

Python中的多态性是基于对象的行为的。在其他语言中对象可能被要求属于某一个类或者被要求实现某个接口,但Python中只是简单地要求它遵守几个给定的规则。

基本的序列和映射规则

序列和映射是对象的集合。为了实现它们基本的行为,如果对象是不可变的,那么就需要使用两个魔法方法,如果是可变的则需要4个。

len(self): 这个方法应该返回集合中所含项目的数量。

getitem(self,key): 这个方法返回与所给键对应的值。

setitem(self,key,value): 这个方法应该按一定的方式存储key和相关的value

delitem(self,key): 这个方法在对一部分对象使用del语句时被调用,同时必须删除和元素相关的键。

对这些方法的附加要求:

对于一个序列来说,需要支持负整数的键

如果键是不合适的类型,会引发一个TypeError异常

如果序列的索引是正确的类型,但是超出了范围,应该引发一个IndexError异常。

遵守标准是使用类型检查的正当理由之一

属性

这一部分略过了

迭代器

迭代器规则

迭代的意思是重复做一些事很多次——就像在循环中做的那样。它实际上也能对其他的对象进行迭代:实现iter方法的对象。

iter_方法返回一个迭代器,所谓的迭代器就是具有next方法(这个方法在调用时不需要任何参数)的对象。在调用next方法时,迭代器会返回它的下一个值。如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopIteration异常。

从迭代器得到序列

除了
bc69
在迭代器和可迭代对象上进行迭代,还能把它们转换为序列。关于这个的一个很有用的例子是使用list构造方法显式的的将迭代器转化为列表。

生成器

生成器和迭代器可能是近年来引入的最强大的两个特性。但是生成器的概念则要更高级一些,需要花些功夫才能理解它是如何工作的以及它有什么用处。

生成器可以帮助读者写出非常优雅的代码。生成器是一种用普通的函数语法定义的迭代器。

创建生成器

任何包含yield语句的函数称为生成器。除了名字不同以外,它的行为和普通的函数也有很大的差别。这就在于它不是像return那样返回值,而是每次产生多个值。每次产生一个值(使用yield语句),函数就会被冻结:即函数停在那点等待被激活。函数被激活后就从停在的那点开始执行。

接下来可以通过在生成器上迭代来使用所有的值。

使用下面的代码:

>>> nested = [[1,2],[3,4],[5,6]]
>>> def flatten(nested):
...     for sublist in nested:
...         for element in sublist:
...             yield element
...
>>> for num in flatten(nested):
...     print num
...
1
2
3
4
5
6


递归生成器

这一部分跳过了

通用生成器

生成器是一个包含yield关键字的函数,当它被调用时,在函数体中的代码不会被执行,而会返回一个迭代器。每次请求一个值,就会执行生成器 中的代码,直到遇到一个yield或者return语句。yield语句意味着应该生成一个值。return语句意味着生成器要停止执行(不再生成任何东西,return语句只有在一个生成器中使用时才能进行无参数调用)。

生成器方法

主要说了生成器的generator的send方法的使用,感觉暂时用不到,先略过了。

模拟生成器

讲如何在旧版本的Python中使用函数模拟实现生成器,也略过了。

本章后面还有八皇后问题,先略过了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: