欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python裝飾器使用示例及實際應用例子

系統 1741 0

測試1

deco運行,但myfunc并沒有運行

復制代碼 代碼如下:

def deco(func):
??? print 'before func'
??? return func

def myfunc():
??? print 'myfunc() called'
?
myfunc = deco(myfunc)

測試2

需要的deco中調用myfunc,這樣才可以執行

復制代碼 代碼如下:

def deco(func):
??? print 'before func'
??? func()
??? print 'after func'
??? return func

def myfunc():
??? print 'myfunc() called'
?
myfunc = deco(myfunc)

測試3

@函數名 但是它執行了兩次

復制代碼 代碼如下:

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

@帶參數,使用嵌套的方法

復制代碼 代碼如下:

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

函數參數傳遞

復制代碼 代碼如下:

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

未知參數個數

復制代碼 代碼如下:

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')

Python裝飾器使用示例及實際應用例子_第1張圖片

測試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()

實例

給函數做緩存 --- 斐波拉契數列

復制代碼 代碼如下:

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)

注冊回調函數 --- web請求回調

復制代碼 代碼如下:

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()


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 奇米影视第 | 李旭个人资料及简介 | 中文字幕av一区 | 黄色激情网站 | 欧美free性 | 国产精品久久久久久久一区探花 | 欧美在线精品一区二区在线观看 | 2019天天操夜夜操 | 六月婷婷久久 | 成人黄色免费视频 | 国产精品99| 国产综合在线播放 | 久久久不卡网国产精品一区 | 成人免费高清 | 哥斯拉大战金刚2在线观看免费完整版 | 欧美爽爽爽高清免费视频 | 午夜国产精品免费观看 | 亚洲高清中文字幕一区二区三区 | 成人av一区 | 91综合网| 青娱乐久草 | 久草6| 欧美亚洲理伦电影毛片在线播放 | 亚洲欧美日韩精品一区 | 久久99热成人精品国产 | 亚洲精品久久久久久久久久吃药 | 欧美伦妇高清免费 | 一二区视频 | 鲁久久| 久热久热 | 夜操| 国产成人精品福利网站在线观看 | 天天干天天夜 | 色综合小说网 | 一区二区视频在线 | 成人97在线观看免费高清 | 日韩有码在线观看 | 国产日韩综合 | 日韩黄色一级毛片 | 欧美日韩在线第一页 | 成人性大片免费观看网站 |