连续3天开会,苦逼!打乱节奏!趁着会议期间,溜出来看看书,码代码,不亦乐乎!!!
第8章 python类的特殊方法
- 是不是常常见到很多双下划线的方法或者属性?这些其实很烦人的,因为看着不舒服。但这些特殊的东东能实现特殊的功能,最常见的就是构造方法:
__init__
,这个可以实现自己的初始化逻辑。 - 问题1:打印输出一个对象,比如类的对象,经常见到如下的东东:
>>> class Item:
def __init__(self,name,price):
self.name=name
self.price=price
>>> im=Item('鼠标',29.8)
>>> print(im)
<__main__.Item object at 0x0000020BC93CCE48>
- 分析1:这里打印的时候调用了对象的
__repr__()
方法的返回值,所以你会发现打印对象和该对象的这个方法,打印出来的东东一样。
>>> print(im)
<__main__.Item object at 0x0000020BC93CCE48>
>>> print(im.__repr__)
<method-wrapper '__repr__' of Item object at 0x0000020BC93CCE48>
- 扩展1:有了上面这个“自我描述”的方法,我们自己设计类的时候,就可以通过重写这个方法,完全打印类的状态,好用吧?
- 问题2:生成器是一种非常优秀的语法,使用这个可以让程序变得很优雅!!!哎呀我去,说的高大上,优雅归优雅,刚碰到这东东还是比较难理解的。
>>> def test(val,step):
print('函数开始执行')
cur=0
for i in range(val):
cur+=i*step
yield cur
创建生成器需要两个步骤:(1)定义一个包含yield语句的函数;(2)调用第1步得到生成器。
你会发现如果将test函数的最后一行修改为:print(cur)
,就成了简单的函数了,实现的功能就是简单的遍历区间,并将循环计数器乘以step后添加到cur变量上。
8. 分析2:yield cur 语句有两个作用:(1)每次返回一个值,类似于return语句;(2)冻结执行,程序每次执行到这里就会暂停。当程序再次调用next()函数获取生成器的下一个值时,程序才会继续向下执行。
>>> t=test(10,2)
>>> print(next(t))
函数开始执行
0
>>> print(next(t))
2
可以看到,程序执行t=test(10,2)的时候,程序并没有执行test()函数,只是第一次调用next函数时,才开始执行test函数。
10. 其它的不好玩,也没感兴趣的,大家自己看看吧。还有个好玩的hash函数,可以获取哈希码,做作业题的童鞋可能需要,自己琢磨着玩一下了。