我正在使用flask和flask-restplus编写一个webapi。我已经创建了一个装饰器来计算执行api调用的时间。
import time
class TimeCalculateDecorator:
def __init__(self, func):
self.function = func
def __call__(self,*args, **kws):
ts = time.time()
result = self.function(*args, **kws)
te = time.time()
print('func:%r args:[%r, %r] took: %2.4f sec' % \
(self.function.__name__, args, kw, te-ts))
return result这就是我如何使用它..。
class MultipleEmp_controller(Resource):
@inject
def __init__(self,api, dataservice:DataServiceBase):
self.service = dataservice
@TimeCalculateDecorator
def get(self):
"""Get Request for version 1"""
emp_schema = EmployeeSchema(many=True)
emps = emp_schema.dump(self.service.getemployees())
return emps当装饰器调用上述控制器方法时,发现那里缺少self参数,问题就来了。下面是确切的错误消息...
"get() missing 1 required positional argument: 'self'",我试过谷歌,但没有成功。
我试着使用简单的方法装饰器,如下所示。
def timeit(method):
def timed(*args, **kw):
ts = time.time()
result = method(*args, **kw)
te = time.time()
print('func:%r args:[%r, %r] took: %2.4f sec' % \
(method.__name__, args, kw, te-ts))
return result
return timed这一切都运行得很好。当我把它作为类,而不是方法时,问题就来了。
发布于 2020-03-03 22:22:27
您的TimeCalculateDecorator正在调用包装函数,但没有传入对正确MultipleEmp_controller实例的引用。
我不确定如何使用纯装饰器获得正确的引用,但这里有一种在类初始化期间实现装饰性方法的方法:
import time
class TimeCalculateDecorator:
def __init__(self, func, **kwargs):
self.function = func
def __call__(self,*args, **kws):
ts = time.time()
result = self.function(*args, **kws)
te = time.time()
print('func:%r args:[%r, %r] took: %2.4f sec' % \
(self.function.__name__, args, kws, te-ts))
return result
class MultipleEmp_controller(object):
def __init__(self, *args, **kwargs):
self.get = TimeCalculateDecorator(self.get)
return
def get(self):
"""Get Request for version 1"""
print('called')
return
if __name__ == '__main__':
x = MultipleEmp_controller()
x.get()另外,值得回顾一下这个answer。
https://stackoverflow.com/questions/60502249
复制相似问题