鱼C论坛

 找回密码
 立即注册
查看: 939|回复: 1

请教大佬一个关于装饰器参数的问题

[复制链接]
发表于 2018-7-5 10:34:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
假设我有一个函数recvComm(里面是什么不用管,反正只需要知道函数最后出去一个data就行)
  1. def recvComm(obj, BUFFSIZE):
  2.     lenth = struct.unpack('i', obj.recv(4))[0]
  3.     data = json.loads(script.recvData(obj, BUFFSIZE, lenth), encoding='utf8')
  4.     return data
复制代码


我想要让这个函数每次运行都把结果记录日志,于是写了个装饰器
  1. def recordCommLog(DBobject):
  2.     def outer(func):
  3.         def inner(*args):
  4.             res = func(*args)
  5.             DBobject.loggerSave(res)
  6.             return res
  7.         return inner
  8.     return outer
复制代码


加到一起是这样
  1. @recordCommLog(DBobject)
  2. def recvComm(obj, BUFFSIZE):
  3.     lenth = struct.unpack('i', obj.recv(4))[0]
  4.     data = json.loads(script.recvData(obj, BUFFSIZE, lenth), encoding='utf8')
  5.     return data
复制代码


但现在有个问题,这个装饰器的参数DBobject是个数据库类对象(数据库的操作都放到数据库类里面执行,这个DBobject是这个类的一个实例),并且上面这个函数包括装饰器是在主逻辑文件下面的一个模块里面(被当做一个模块导入主逻辑),而且这个DBobject是在主逻辑程序下面实例化的,所以需要作为参数导入到函数里。
小弟废柴,查遍了baidu也没查到这种情况应该怎么做(都是把装饰器参数当做flag来使用的),求教大佬这种情况下,怎么写才能把参数传进装饰器里?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-7-5 10:44:56 | 显示全部楼层
你只能给被装饰的函数传参,没法给装饰器传,装饰器的那个参数就是你被装饰的函数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-12-31 14:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表