測試1
deco運(yùn)行,但myfunc并沒有運(yùn)行
def deco(func):
??? print 'before func'
??? return func
def myfunc():
??? print 'myfunc() called'
?
myfunc = deco(myfunc)
測試2
需要的deco中調(diào)用myfunc,這樣才可以執(zhí)行
def deco(func):
??? print 'before func'
??? func()
??? print 'after func'
??? return func
def myfunc():
??? print 'myfunc() called'
?
myfunc = deco(myfunc)
測試3
@函數(shù)名 但是它執(zhí)行了兩次
def deco(func):
??? print 'before func'
??? func()
??? print 'after func'
??? return func
@deco
def myfunc():
??? print 'myfunc() called'
myfunc()
測試4
這樣裝飾才行
def deco(func):
??? def _deco():
??????? print 'before func'
??????? func()
??????? print 'after func'
??? return _deco
@deco
def myfunc():
??? print 'myfunc() called'
?
myfunc()
測試5
@帶參數(shù),使用嵌套的方法
def deco(arg):
??? def _deco(func):
??????? print arg
??????? def __deco():
??????????? print 'before func'
??????????? func()
??????????? print 'after func'
??????? return __deco
??? return _deco
@deco('deco')
def myfunc():
??? print 'myfunc() called'
?
myfunc()
測試6
函數(shù)參數(shù)傳遞
def deco(arg):
??? def _deco(func):
??????? print arg
??????? def __deco(str):
??????????? print 'before func'
??????????? func(str)
??????????? print 'after func'
??????? return __deco
??? return _deco
@deco('deco')
def myfunc(str):
??? print 'myfunc() called ', str
?
myfunc('hello')
測試7
未知參數(shù)個數(shù)
def deco(arg):
??? def _deco(func):
??????? print arg
??????? def __deco(*args, **kwargs):
??????????? print 'before func'
??????????? func(*args, **kwargs)
??????????? print 'after func'
??????? return __deco
??? return _deco
@deco('deco1')
def myfunc1(str):
??? print 'myfunc1() called ', str
@deco('deco2')
def myfunc2(str1,str2):
??? print 'myfunc2() called ', str1, str2
?
myfunc1('hello')
?
myfunc2('hello', 'world')
測試8
class作為修飾器
class myDecorator(object):
?
??? def __init__(self, fn):
??????? print "inside myDecorator.__init__()"
??????? self.fn = fn
?
??? def __call__(self):
??????? self.fn()
??????? print "inside myDecorator.__call__()"
?
@myDecorator
def aFunction():
??? print "inside aFunction()"
?
print "Finished decorating aFunction()"
?
aFunction()
測試9
class myDecorator(object):
?
??? def __init__(self, str):
??????? print "inside myDecorator.__init__()"
??????? self.str = str
??????? print self.str
?
??? def __call__(self, fn):
??????? def wrapped(*args, **kwargs):
??????????? fn()
??????????? print "inside myDecorator.__call__()"
??????? return wrapped
?
@myDecorator('this is str')
def aFunction():
??? print "inside aFunction()"
?
print "Finished decorating aFunction()"
?
aFunction()
實(shí)例
給函數(shù)做緩存 --- 斐波拉契數(shù)列
from functools import wraps
def memo(fn):
??? cache = {}
??? miss = object()
????
??? @wraps(fn)
??? def wrapper(*args):
??????? result = cache.get(args, miss)
??????? if result is miss:
??????????? result = fn(*args)
??????????? cache[args] = result
??????? return result
?
??? return wrapper
?
@memo
def fib(n):
??? if n < 2:
??????? return n
??? return fib(n - 1) + fib(n - 2)
print fib(10)
注冊回調(diào)函數(shù) --- web請求回調(diào)
class MyApp():
??? def __init__(self):
??????? self.func_map = {}
?
??? def register(self, name):
??????? def func_wrapper(func):
??????????? self.func_map[name] = func
??????????? return func
??????? return func_wrapper
?
??? def call_method(self, name=None):
??????? func = self.func_map.get(name, None)
??????? if func is None:
??????????? raise Exception("No function registered against - " + str(name))
??????? return func()
?
app = MyApp()
?
@app.register('/')
def main_page_func():
??? return "This is the main page."
?
@app.register('/next_page')
def next_page_func():
??? return "This is the next page."
?
print app.call_method('/')
print app.call_method('/next_page')
mysql封裝 -- 很好用
import umysql
from functools import wraps
?
class Configuraion:
??? def __init__(self, env):
??????? if env == "Prod":
??????????? self.host??? = "coolshell.cn"
??????????? self.port??? = 3306
??????????? self.db????? = "coolshell"
??????????? self.user??? = "coolshell"
??????????? self.passwd? = "fuckgfw"
??????? elif env == "Test":
??????????? self.host?? = 'localhost'
??????????? self.port?? = 3300
??????????? self.user?? = 'coolshell'
??????????? self.db???? = 'coolshell'
??????????? self.passwd = 'fuckgfw'
?
def mysql(sql):
?
??? _conf = Configuraion(env="Prod")
?
??? def on_sql_error(err):
??????? print err
??????? sys.exit(-1)
?
??? def handle_sql_result(rs):
??????? if rs.rows > 0:
??????????? fieldnames = [f[0] for f in rs.fields]
??????????? return [dict(zip(fieldnames, r)) for r in rs.rows]
??????? else:
??????????? return []
?
??? def decorator(fn):
??????? @wraps(fn)
??????? def wrapper(*args, **kwargs):
??????????? mysqlconn = umysql.Connection()
??????????? mysqlconn.settimeout(5)
??????????? mysqlconn.connect(_conf.host, _conf.port, _conf.user, \
????????????????????????????? _conf.passwd, _conf.db, True, 'utf8')
??????????? try:
??????????????? rs = mysqlconn.query(sql, {})?????
??????????? except umysql.Error as e:
??????????????? on_sql_error(e)
?
??????????? data = handle_sql_result(rs)
??????????? kwargs["data"] = data
??????????? result = fn(*args, **kwargs)
??????????? mysqlconn.close()
??????????? return result
??????? return wrapper
?
??? return decorator
?
?
@mysql(sql = "select * from coolshell" )
def get_coolshell(data):
??? ... ...
??? ... ..
線程異步
from threading import Thread
from functools import wraps
?
def async(func):
??? @wraps(func)
??? def async_func(*args, **kwargs):
??????? func_hl = Thread(target = func, args = args, kwargs = kwargs)
??????? func_hl.start()
??????? return func_hl
?
??? return async_func
?
if __name__ == '__main__':
??? from time import sleep
?
??? @async
??? def print_somedata():
??????? print 'starting print_somedata'
??????? sleep(2)
??????? print 'print_somedata: 2 sec passed'
??????? sleep(2)
??????? print 'print_somedata: 2 sec passed'
??????? sleep(2)
??????? print 'finished print_somedata'
?
??? def main():
??????? print_somedata()
??????? print 'back in main'
??????? print_somedata()
??????? print 'back in main'
?
??? main()
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
