我想要一个代表多项式函数的类。调用类的实例时,我想查看该函数的字符串表示形式
例如
f = Polynomial([0,1,2])
f
> +2²
这很好,我只编写了一个合适的__repr__
函数-能够以给定的值评估该函数也很好-所以我想做的是这样的:
f(3)
> 21
那我该怎么做呢?是否要使用附加参数编写第二个重载的__repr__
函数,还是更改现有的__repr__
使其具有可选参数?
可悲的是,我似乎无法使第一个工作,而使用这些选项中的第二个,我得到了错误:
TypeError: 'Polynomial' object is not callable
关于这种双重行为的任何想法:
f
> +2²
和
f(3)
> 21
第一个只是f的表示形式,第二个是在= 3处的求值。
答案 0 :(得分:4)
如果你想支持的呼叫的你的对象,那么就实现__call__
method,并返回结果,让所需的表示。
如果对于给定值x
,结果始终是整数,则只需返回该整数即可:
class Polynomial:
X = "\U0001d465"
X_squared = X + "\u00b2"
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def __repr__(self):
parts = []
if self.a:
a = self.X_squared
if self.a > 1:
a = f"{self.a}{a}"
parts.append(a)
if self.b:
b = self.X
if self.b > 1:
b = f"{self.b}{b}"
parts.append(b)
if self.c:
parts.append(str(self.c))
if not parts:
parts = ['0']
return ' + '.join(parts)
def __call__(self, x):
return self.a * (x ** 2) + self.b * x + self.c
获得所需的输出:
>>> p = Polynomial(2, 1, 0)
>>> p
2² +
>>> p(3)
21
请注意,__repr__
通常旨在产生的调试输出。无法进行配置,对象具有特定状态,__repr__
应该或多或少显示该状态。
如果要使字符串格式可配置,请查看__format__
hook和str.format()
使用的format()
。如果要使对象在交互式Python设置中使用,那可能不适合您的用途。
您可能还想研究SymPy project handles output formatting的方式;该项目explicitly avoids using __repr__
。相反,在IPython外部,当显示sympy-project对象时,他们设置了自定义sys.displayhook()
function来使用自己的漂亮打印功能,而不是repr()
。有关详细信息,请参阅sympy.interactive.printing
module source code