在 Python 加 peewee 让数据库访问更简单一文中有几个函数需要连接数据库, 这样就导致了一些重复代码
1.PNG
有过 Java Spring 开发经验的同学就要跳出来了, 这样不简洁, Spring 早就可以 AOP 了, 根本不用操心数据库连接的问题. Python 当然可以啊, 而且是语言级别就已经支持了, 这个功能叫 decorator, 中文都叫装饰器. 有没有想起什么? 对了, 这就是设计模式里的 decorator 模式
我们创建一个新方法, 在方法内再建个 wrapper 方法, 虽然感觉很奇怪, 但就是这么写的. 当然这两个方法名可以随便起了, 样式一致即可
2.PNG
func 就是要被修饰的方法, 做为一个参数传入到 db_connect 方法里, 我们就可以在 func 前面连接数据库就好. 最后返回 wrapper. 这也是 python 比较特别的地方, 方法是可以作为参数传来传去的. 这比 Java 只能在类级别的反射上做文章吧, 一个简单的功能也需要建个类
最后我们在每个需要连接数据库的函数名前加上 @db_connect 就可以了. 每个函数都会自动连接数据库. 又有同学说了, 这有什么区别, 行数没变啊. 但这样你不觉得核心代码更简洁了吗? 不需要操心数据库连接的问题了. 同样你还可以在 db_connect 里加些日志或者事务连接什么的, 这样就是全局性的改变了, 不用你每个函数都去修改一遍.
其实这就是 Python 元编程, 也就是在你的代码上再编程去操作你的代码, 虽然听着有点呦口, 但是做到后很爽. 有兴趣的同学可以看下 Python 的官方文档.
来源: http://www.jianshu.com/p/2c639c5065ca