关于pycairo装饰器示例的疑问:未显式调用函数为何能执行?
疑问:未显式调用函数却生成图形的原因
这段来自GitHub的pycairo示例代码在Jupyter Notebook中能生成内嵌圆形,但看起来只定义了函数没有显式调用,为什么会自动运行生成图形?
import cairo from IPython.display import Image, display from math import pi from io import BytesIO def disp(draw_func): surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 200, 200) ctx = cairo.Context(surface) draw_func(ctx, 200, 200) with BytesIO() as fileobj: surface.write_to_png(fileobj) display(Image(fileobj.getvalue(), width=200)) @disp def draw(cr, width, height): # cr.scale(width, height) cr.set_line_width(8) cr.arc(100, 100, 60, 0, 2 * pi) cr.stroke()
核心原因:Python装饰器的自动执行机制
你忽略的是**@disp这个装饰器的作用**,它不是普通的函数定义标记,而是会触发一系列自动执行的逻辑:
@disp是Python的装饰器语法糖,等价于在定义完draw函数后自动执行draw = disp(draw)- 当代码执行到这一行时,disp函数会立即被调用,参数就是刚定义好的draw函数
- 在disp函数内部,不仅创建了绘图所需的surface和上下文ctx,还主动调用了
draw_func(ctx, 200, 200)——也就是执行了draw函数里的绘图逻辑 - 最后disp函数把生成的PNG图像通过Jupyter的display接口展示出来,整个过程不需要你手动写
draw()去调用
简单说,装饰器@disp已经替你完成了对draw函数的调用,还打包处理了绘图结果的显示逻辑。
内容的提问来源于stack exchange,提问作者Prof Michael Huster
相关产品推荐
相关产品推荐

