我正在尝试编写一个包含一些数学函数的小型Python模块.例如,它可能包含如下函数:
def quad(x, a, b, c):
return a*x**2 + b*x + c
Run Code Online (Sandbox Code Playgroud)
您可能会注意到它a, b, c除了变量之外还包含几个参数(即)x.现在,如果我将它放在一个文件中并简单地导入它,最终用户必须始终使用除变量之外的参数调用该函数.因此我想创建一个这样的类:
class quad:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def eq(x):
return self.a*x**2 + self.b*x + self.c
Run Code Online (Sandbox Code Playgroud)
从而允许最终用户将其用作:
q = quad(p, q, r)
eq = q.eq
Run Code Online (Sandbox Code Playgroud)
这是正确的做事方式吗?我对这个问题的标题非常抱歉,因为我想不出更好的一个!
这似乎是一个完全合理的类使用.基本上,当程序涉及可以建模为具有状态的对象的事物时,您应该考虑使用类.在这里,你的多项式的"状态"只是系数a,b和c.
您还可以使用Python的__call__特殊方法来允许您将类视为函数本身:
class quad:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def __call__(x):
return self.a * x**2 + self.b * x + self.c
q = quad(p, q, r)
q(x)
Run Code Online (Sandbox Code Playgroud)
另一种方法,它可以稍微清洁,只是返回一个函数,其中系数被烘焙到其中.这基本上是一个currying的例子,正如Tichodrama提到的:
def quad(a, b, c):
def __quad(x):
return a * x**2 + b * x + c
return __quad
Run Code Online (Sandbox Code Playgroud)
或者使用lambda语法:
def quad(a, b, c):
return lambda x: a * x**2 + b * x + c
Run Code Online (Sandbox Code Playgroud)
这些可以像这样使用:
q = quad(p, q, r)
q(x)
Run Code Online (Sandbox Code Playgroud)