python给函数添加属性_向Python函数添加属性的最佳方法

更好的方法是使用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。

这种方法的另一个缺点是每次调用函数时都要执行该赋值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值