创建一个python类,该类既可以返回自身的表示形式,又可以返回计算结果

时间:2019-02-02 18:12:50

标签: python class

我想要一个代表多项式函数的类。调用类的实例时,我想查看该函数的字符串表示形式

例如

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处的求值。

1 个答案:

答案 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__ hookstr.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