数据模型
python中,一个对象object是数据的抽象,封装了与数据的一些操作
Python中,存在一个顶层的抽象,然后有对应一个函数实现
主要包含了一些顶层的操作,比如加法,sum,打印,len,call等,这些顶层的抽象操作对应一个内建函数__function__(),通过实现这些内建函数完成数据顶层特性的封装。
class Complex(object):
"""复数"""
def __init__(real=0, virtual=0):
self.real = real
self.virtual = virtual
def __add__(others)
“”“复数加法”“”
metaclass元类
python是动态语言,与静态语言一个重要区别就是,类和函数的定义也是运行时完成。所以可以通过hook到类创建的过程中,修改类创建的过程。
MetaClass主要用来控制类本身的创建。
顶层抽象,类的创建对应函数实现metaclass.__new__()
装饰器
由于函数的定义也是运行时可执行代码,所以我们可以重新修改函数的定义在运行时。
装饰器就是可以动态地去修改一个函数,并且可以嵌套一直修改。
在运行时,修改函数的行为。在python中,一切皆对象,函数的定义和类的定义一样,可以在运行时修改。
生成器
生成器的作用是避免一次性输出所有数据,而是通过交错运行迭代完成函数输出。
def gen():
for c in 'abc':
yield c
generator = gen()
for c in generator:
print(c)
上下文管理器
在很多场景下,我们需要交错执行命令,比如打开文件流
读取内容,业务逻辑操作
关闭文件流
如果未正常关闭文件流可能会导致资源泄露问题。
这是一个常见的问题,在python中有对应的上下文管理抽象,也对应一个函数实现object.__enter__(self)
class Sample:
def __enter__(self):
return self
def __exit__(self, type, value, trace):
pass
更方便的做法,我们可以通过上下文管理器
这里会用到上面两个特性,装饰器和迭代器。
通过装饰器动态修改函数的行为
通过迭代器实现代码逻辑的交错执行。
import time
from contextlib import contextmanager
@contextmanager
def timeit(label):
start = time.time()
try:
yield
finally:
end = time.time()
print('{}: {}'.format(label, end - start))
with timeit('counting'):
n = 10000000
while n > 0:
n -= 1