我如何将float提升到另一个类的实例?

时间:2019-09-26 18:20:02

标签: python

我尝试使用automatic differentiation的扩充代数在python(3.7.4)中实现dual numbers,这是对实数进行实数和对偶(类似于复数)的扩展。我现在需要将浮点运算符(例如+-* / ^)扩展到它们。加法,减法,乘法和除法易于实现(我以与here相同的方式进行操作),但是,在求幂时遇到了问题。

我有这样实现的DualNumber类:

class DualNumber:
    def __init__(self, real, dual):
        self.real = real
        self.dual = dual

    # definitions of __add__, __sub__, __mul__ etc. ...

    def __pow__(self, other):
        if isinstance(other, DualNumber):
            return DualNumber(self.real ** other.real,
                              self.dual * other.real * self.real ** (other.real - 1) + self.real ** other.real * other.dual * log(self.real))
        else:
            return DualNumber(self.real**other,
                              self.dual * other * self.real**(other - 1))

def auto_diff(f, x):
    return f(DualNumber(x, 1.)).dual

这仅允许对DualNumber的实例求幂。当没有类似于其他运算符的反向变体的__rpow__时,如何定义浮点数到DualNumber实例的输出?这样我就可以执行

之类的操作
a = DualNumber(1,2)
5 ** a

注意:“浮点数”是指实数的任何表示形式。

1 个答案:

答案 0 :(得分:1)

有一个__rpow__。可以在Python data model page

上找到它的文档。
class X:
    def __rpow__(self, other):
        return "rpow"

x = X()
print(1**x)  # rpow