【发布时间】:2021-01-04 23:06:19
【问题描述】:
我写了一个这样的类:
class AbstractBigHandler(AbstractHandler, ActionTimer):
def __init__(self, path, data_container):
AbstractHandler.__init__(self)
ActionTimer.__init__(self, data_container)
@time_action
def handle(self, request):
# Do something
我想给其中的handle()方法计时,所以我想出了一个想法来编写一个mixin类,它会在其中提供一个装饰器类,因为在我看来,它可以很好地分离关注点代码。此外,我希望这个 mixin 类可以被我稍后编写的其他类重用:
class ActionTimer:
def __init__(self, data_container):
self.data_container = data_container
self.class_name = self.__class__.__name__
def time_action(self, func):
def wrapper(self, func, *args, **kwargs):
start_time = datetime.now()
func_output = func.handle(args, kwargs)
end_time = datetime.now()
execution_time = end_time - start_time
print(self.__class__.__name__, " execution time: ", execution_time)
self.data_container.add_data(self.class_name, execution_time)
return func_output
return wrapper
其中的 data_container 参数只是一个我打算浮动的单例,并在其字典属性中收集数据(通过 .add_data() 方法)。
现在,当我尝试为 AbstractBigHandler 类运行测试时,它在实例化时立即失败,并出现以下错误堆栈:
C:\project\tests>python -m unittest test_abstract_big_handler
Traceback (most recent call last):
File "C:\Users\***\AppData\Local\Continuum\anaconda3\lib\runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "C:\Users\***\AppData\Local\Continuum\anaconda3\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "C:\Users\***\AppData\Local\Continuum\anaconda3\lib\unittest\__main__.py", line 18, in <module>
main(module=None)
File "C:\Users\***\AppData\Local\Continuum\anaconda3\lib\unittest\main.py", line 100, in __init__
self.parseArgs(argv)
File "C:\Users\***\AppData\Local\Continuum\anaconda3\lib\unittest\main.py", line 147, in parseArgs
self.createTests()
File "C:\Users\***\AppData\Local\Continuum\anaconda3\lib\unittest\main.py", line 159, in createTests
self.module)
File "C:\Users\***\AppData\Local\Continuum\anaconda3\lib\unittest\loader.py", line 220, in loadTestsFromNames
suites = [self.loadTestsFromName(name, module) for name in names]
File "C:\Users\***\AppData\Local\Continuum\anaconda3\lib\unittest\loader.py", line 220, in <listcomp>
suites = [self.loadTestsFromName(name, module) for name in names]
File "C:\Users\***\AppData\Local\Continuum\anaconda3\lib\unittest\loader.py", line 154, in loadTestsFromName
module = __import__(module_name)
File "C:\project\tests\test_abstract_big_handler.py", line 5, in <module>
from project.common.handlers.AbstractBigHandler import AbstractBigHandler
File "C:\project\common\handlers\AbstractBigHandler.py", line 17, in <module>
class AbstractBigHandler(AbstractHandler, ActionTimer):
File "C:\project\common\handlers\AbstractBigHandler.py", line 69, in AbstractBigHandler
@time_action
NameError: name 'time_action' is not defined
我不确定为什么会发生这种情况 - 因为 ActionTimer 类作为第二个继承类添加到 AbstractBigHandler 类中,它的方法 time_action() 应该(并且当我检查 PDB 时)存在于 AbstractBigHandler 的方法中.
帮助?
【问题讨论】:
标签: python python-3.x oop decorator