今天这个话题很有意思,能够帮助理解python装饰器的含义。使用过VS做图像处理的同学可能接触过Image Watch这个调试工具,其界面如下图所示。可参见如下链接:https://blog.csdn.net/iracer/article/details/83413877
今天,在python下找到了一个类似的工具,叫pyimagewatch. 虽然没有完全理解其使用,但其思路可以参考一下:实现相关功能的方式就是给相应的opencv函数写一个装饰器。比如想查看一个opencv函数的执行结果(Watcher功能),实现所用的代码如下:
class Checker:
"""Checker for OpenCV functions."""
def __init__(self, cv_function_name: str):
"""Checker for OpenCV functions."""
cv.namedWindow(cv_function_name)
self.cv_function_name = cv_function_name
self.cv_function = getattr(cv, cv_function_name)
def start(self, decorator):
"""Starts checking the OpenCV function."""
setattr(cv, self.cv_function_name, decorator())
def stop(self):
"""Stops checking the OpenCV function."""
setattr(cv, self.cv_function_name, self.cv_function)
class Watcher(Checker):
"""Watcher for OpenCV functions."""
def watch(self):
"""Decorator to watch an OpenCV function."""
@wraps(self.cv_function)
def wrapper(*args, **kwargs):
result = self.cv_function(*args, **kwargs)
cv.imshow(self.cv_function_name, result)
cv.waitKey()
return result
return wrapper
def start(self):
"""Starts watching the OpenCV function."""
super().start(self.watch)
其中Checker是基类,Watcher是派生类。Checker构造函数需要传入一个opencv函数名,Checker.start函数将opencv函数与相应的装饰器函数绑定;装饰器函数是由Watcher.watch函数生成的。可以看到Watcher.watch是一个典型的装饰器函数,其功能是除了执行原有的opencv函数之外,还对函数结果进行了显示cv.imshow(self.cv_function_name, result)
;这体现了装饰器函数的核心:得到一个增强函数,替换原有函数,并保持一样的名字。
python装饰器的知识可以参考:
- https://www.liaoxuefeng.com/wiki/1016959663602400/1017451662295584
- https://www.bilibili.com/video/BV1SZ4y1s7cv?p=1