魔法方法
魔法方法总是被双下划线包围,例如__init__
魔法方法是面向对象Python的一切,如果你不知道魔法方法,说明你还没意识到面向对象Python的强大
__init__
__del__
__new__
自定义对象的算术运算符
__add__
__sub__
__mul__
__truediv__
__mod__
__divmod__
__pow__
__lshift__
__and__
__xor__
__or__
这些都是以基础内置类型作为蓝本进行定制修改。如int,可以查看内置方法
int.__dict__
重写这些方法,来达到对Python对象的自定义运算支持。类似c++的运算符重载机制。
getattr, setattr, delattr
属性访问
__getattr__(self, name)
__setattr__(self, name)
__getattribute__(self, name)
__delattr__(self, name)
生成器
是迭代器的另一种实现方式,通常迭代器需要定义一个class并实现next方法,
而生成器只需要在普通的函数func中加入yield语句。
协同程序
就是可以运行的独立函数调用,函数可以暂停或者挂起,并在需要的时候从程序离开的地方继续或者重新开始。
def libs():
a = 0
b = 1
while True:
a, b = b, a + b
yield a
>>> for each in libs():
... if each > 100:
... break
... print(each)
...
1
1
2
3
5
8
13
21
34
55
89
>>> e = libs()
>>> e
<generator object libs at 0x7ffee149d8e0>
>>> next(e)
1
>>> next(e)
1
>>> next(e)
2
>>> next(e)
3
>>> next(e)
5
>>> next(e)
8
>>> next(e)
13
>>> next(e)
>>> string = 'wangdachao'
>>> next(string)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object is not an iterator
>>> it = iter(string)
>>> next(it)
'w'
>>> next(it)
'a'
>>> next(it)
'n'
>>> next(it)
'g'
>>> next(it)
'd'
class Fibs():
def __init__(self):
self.a = 0
self.b = 1
def __iter__(self):
return self
def __next__(self):
self.a, self.b = self.b, self.a + self.b
return self.a
e = Fibs()
>>> e
<__main__.Fibs object at 0x039D11D0>
>>> next(e)
1
>>> next(e)
1
>>> next(e)
2
>>> next(e)
3
>>> next(e)
5
>>>