前面的文章让我们的程序能轻松的应对业务的变更了。这本该是一件皆大欢喜的事。但是,本系列文章的目的不仅仅在于此,而且还没有满足哪些要少些代码的程序员的要求。
“装饰器模式”想必这对程序员来说并不陌生。基本上问每一个程序员,他们都能回答的头头是道。而且有写面试官肯定在面试的时候回问(这个框架用了什么模式啊。用装饰器有什么好处啊)。
我想说的是,你知道装饰器那么多。你在你的项目中使用了这种模式么(除了使用框架给你分装的)?我想有大半的程序员没有在自己的项目中编写装饰器来使用吧。所以还是恳求,知道就用上吧。
本篇文章的目的是使用装饰器来方便和简化我们开发,让我们的业务方法变简单。
我们使用三个装饰器方法来完成我们的目标:
装饰器方法名 | 用途 |
join_order | 和订单信息进行合并(无论什么数据只要有user_id做关联) |
join_order_good | 和订单商品信息进行合并(无论什么数据只要有order_id做关联) |
join_coupon | 和券信息进行合并(无论什么数据只要有order_id做关联) |
第一步、获取用户信息和获取订单信息进行程序拼凑后返回结果(在装饰器join_order方法中实现)。
第二步、获取订单商品信息并且并和“第一步”获得的结果进行拼凑并返回结果(在装饰器join_order_good方法中实现)。
第三步、获取订单券信息并且和“第二步”获得的结果进行拼凑并返回结果(在装饰器join_coupon方法中实现)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | #!/usr/bin/env python # -*- coding:utf-8 -*- import pandas as pd import mysql . connector import sys import sys reload ( sys ) sys . setdefaultencoding ( ‘utf-8’ ) def get_user_info ( user_ids , conn = None ) : ” ‘ 通过user_id获得用户信息 ‘ ” user_sql = ” ‘ SELECT user_id, name FROM user WHERE user_id = {user_id}; ‘ ” . format ( user_id = ‘,’ . join ( user_ids ) ) user_info = pd . read_sql ( user_sql , conn ) return user_info def get_order_info ( user_ids , conn = None ) : ” ‘ 通过 用户ID 获得订单信息 ‘ ” order_sql = ” ‘ SELECT user_id, order_id, num FROM orders WHERE user_id = {user_id}; ‘ ” . format ( user_id = ‘,’ . join ( user_ids ) ) order_info = pd . read_sql ( order_sql , conn ) return order_info def get_order_good_info ( order_ids , conn = None ) : ” ‘ 通过上面获得的 订单ID 获得订单商品信息。 ‘ ” order_good_sql = ” ‘ SELECT order_id, good_name FROM order_good WHERE order_id IN ({ids}); ‘ ” . format ( ids = ‘,’ . join ( order_ids ) ) order_good_info = pd . read_sql ( order_good_sql , conn ) return order_good_info def get_coupon_info ( order_ids , conn = None ) : ” ‘ 通过 订单ID 获得券信息 ‘ ” coupon_sql = ” ‘ SELECT order_id, name FROM coupon WHERE order_id IN({ids}); ‘ ” . format ( ids = ‘,’ . join ( order_ids ) ) coupon_info = pd . read_sql ( coupon_sql , conn ) return coupon_info def join_order ( func ) : ” ‘ 添加订单信息 ‘ ” def _join_order ( user_id , conn = None ) : user_info = func ( user_id , conn = conn ) user_ids = user_info [ ‘user_id’ ] . astype ( str ) order_info = get_order_info ( user_ids , conn = conn ) new_order = user_info . merge ( order_info , left_on = ‘user_id’ , right_on = ‘user_id’ , how = ‘left’ ) return new_order return _join_order def join_order_good ( func ) : ” ‘ 添加订单商品信息 ‘ ” def _join_order_good ( * args , * * kargs ) : order_info = func ( * args , * * kargs ) order_ids = order_info [ ‘order_id’ ] . astype ( str ) order_good_info = get_order_good_info ( order_ids , * * kargs ) new_order = order_info . merge ( order_good_info , left_on = ‘order_id’ , right_on = ‘order_id’ , how = ‘left’ ) return new_order return _join_order_good def join_coupon ( func ) : ” ‘ 添加券 ‘ ” def _join_coupon ( * args , * * kargs ) : order_info = func ( * args , * * kargs ) order_ids = order_info [ ‘order_id’ ] . astype ( str ) coupon_info = get_coupon_info ( order_ids , * * kargs ) new_order = order_info . merge ( coupon_info , left_on = ‘order_id’ , right_on = ‘order_id’ , how = ‘left’ ) return new_order return _join _coupon @ join _coupon @ join_order _good @ join_order def get_order_detail ( user_id , conn = None ) : ” ‘ 拼凑获得订单信息 ‘ ” user_ids = [ str ( user_id ) ] return get_user_info ( user_ids , conn = conn ) if __name__ == ‘__main__’ : conf = { ‘host’ : ‘127.0.0.1’ , ‘port’ : ‘3306’ , ‘database’ : ‘test’ , ‘user’ : ‘root’ , ‘password’ : ‘root’ } conn = mysql . connector . connect ( * * conf ) print get_order_detail ( 10 , conn = conn ) conn . close ( ) |
输出结果:
1 2 3 4 5 6 7 8 9 10 11 | user_id name_x order_id num good_name name _y 0 10 HH 1 11111 order_good_1 coupon _1 1 10 HH 1 11111 order_good_2 coupon _1 2 10 HH 2 22222 order_good_3 NaN 3 10 HH 2 22222 order_good_4 NaN 4 10 HH 3 33333 order_good_5 coupon _3 5 10 HH 3 33333 order_good_6 coupon _3 6 10 HH 4 44444 order_good_7 NaN 7 10 HH 4 44444 order_good_8 NaN 8 10 HH 5 55555 order_good_9 coupon _5 9 10 HH 5 55555 order_good_10 coupon_5 |
源代码:use_decorator
文章转载来自:trustauth.cn