【发布时间】:2016-01-24 14:27:13
【问题描述】:
我一直在为脚本中的数据库操作编写一些函数,并决定使用函数装饰器来处理数据库连接样板。
一个精简的例子如下所示。
函数装饰器:
import random
class funcdec(object):
def __init__(self,func):
self.state = random.random()
self.func = func
def __call__(self,*args,**kwargs):
return self.func(self.state,*args,**kwargs)
@funcdec
def function1(state,arg1,**kwargs):
print(state)
@funcdec
def function2(state,arg2,**kwargs):
print(state)
function1(10)
function2(20)
这意味着我可以减少样板的数量,但每个函数都有不同的状态对象。所以如果我运行它,我会得到类似的东西:
python decf.py
0.0513280070328
0.372581711374
我想实现一个方法,让所有装饰函数共享这个状态,我想出了这个。
装饰函数装饰器:
import random
class globaldec(object):
def __init__(self,func):
self.state = random.random()
def __call__(self,func,*args,**kwargs):
def wrapped(*args,**kawrgs):
return func(self.state,*args,**kwargs)
return wrapped
@globaldec
class funcdec(object):
pass
@funcdec
def function1(state,arg1,**kwargs):
print(state)
@funcdec
def function2(state,arg2,**kwargs):
print(state)
function1(10)
function2(20)
现在,当我运行它时,每个应用程序只创建一次状态对象,并且所有修饰函数的状态都是相同的,例如:
python decg.py
0.489779827086
0.489779827086
直观地说,这对我来说是有意义的,因为 globaldec 只为函数装饰器的所有实例初始化一次。
但是,我对这里到底发生了什么有点模糊,而且funcdec 对象似乎不再被初始化或调用。
问题:
- 这种技术有名字吗?
- 谁能进一步了解内部发生的情况?
【问题讨论】:
标签: python decorator python-decorators