Python装饰器使用示例及实际应用例子
Python装饰器使用示例及实际应用例子
发布时间:2016-12-28 来源:查字典编辑
摘要:测试1deco运行,但myfunc并没有运行复制代码代码如下:defdeco(func):print'beforefunc'returnfu...

测试1

deco运行,但myfunc并没有运行

复制代码 代码如下:

def deco(func):

print 'before func'

return func

def myfunc():

print 'myfunc() called'

myfunc = deco(myfunc)

Python装饰器使用示例及实际应用例子1

测试2

需要的deco中调用myfunc,这样才可以执行

复制代码 代码如下:

def deco(func):

print 'before func'

func()

print 'after func'

return func

def myfunc():

print 'myfunc() called'

myfunc = deco(myfunc)

Python装饰器使用示例及实际应用例子2

测试3

@函数名 但是它执行了两次

复制代码 代码如下:

def deco(func):

print 'before func'

func()

print 'after func'

return func

@deco

def myfunc():

print 'myfunc() called'

myfunc()

Python装饰器使用示例及实际应用例子3

测试4

这样装饰才行

复制代码 代码如下:

def deco(func):

def _deco():

print 'before func'

func()

print 'after func'

return _deco

@deco

def myfunc():

print 'myfunc() called'

myfunc()

Python装饰器使用示例及实际应用例子4

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

Python装饰器使用示例及实际应用例子5

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

Python装饰器使用示例及实际应用例子6

测试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装饰器使用示例及实际应用例子7

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

Python装饰器使用示例及实际应用例子8

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

Python装饰器使用示例及实际应用例子9

实例

给函数做缓存 --- 斐波拉契数列

复制代码 代码如下:

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

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新python学习
热门python学习
脚本专栏子分类