更好的方法是使用decorators,为此您有两个选择:
基于函数的装饰器:
您可以创建一个基于函数的decorator,它接受latex表示作为参数,并将其附加到它装饰的函数:def latex_repr(r):
def wrapper(f):
f.latex = r
return f
return wrapper
然后,您可以在定义函数时使用它并提供适当的表示:
^{pr2}$
这意味着:func = latex_repr(r'$ax^2 + bx + c$')(func)
并在定义函数后立即使latex属性可用:print(func.latex)
'$ax^2 + bx + c$'
我已经把表示作为一个必需的参数,如果你不想强制总是给出表示,你可以定义一个合理的默认值。在
基于类的装饰器:
如果类是您的首选项,则基于类的修饰符也可以用于类似效果,其方式比您最初的尝试更具python风格:class LatexRepr:
def __init__(self, r):
self.latex = r
def __call__(self, f):
f.latex = self.latex
return f
你用同样的方法:@LatexRepr(r'$ax^2 + bx + c$')
def func(x, a, b, c):
return a*x**2 + b*x + c
print(func.latex)
'$ax^2 + bx + c$'
这里LatexRepr(r'$ax^2 + bx + c$')初始化类并返回可调用实例(__call__定义)。它的作用是:func = LatexRepr(r'$ax^2 + bx + c$')(func)
# __init__
# __call__
做同样的事情wrapped。在
因为它们都只是向函数添加一个参数,所以它们只是按原样返回。他们不会用另一个可调用的来代替它。在
虽然基于类的方法可以做到这一点,但基于函数的decorator应该更快、更轻量级。在
您还问:
“因为Python在执行函数时是“懒惰的”:Python只编译函数体,它不执行其中的任何语句;执行的唯一事情是默认参数值(参见著名的Qhere)。这就是为什么您首先需要调用函数来“获取”属性latex。
这种方法的另一个缺点是每次调用函数时都要执行该赋值