Python 如何控制从自定义对象到numpy.longdoull的转换?

Python 如何控制从自定义对象到numpy.longdoull的转换?,python,numpy,Python,Numpy,我有一个自定义类(出于历史原因),它将高精度数字存储为两个整数,分别表示整数部分和纳米精度非整数部分,例如: 类自定义(对象): 定义初始值(自、内部、纳米): 自我。_int=int_ 自。_nano=nano_ 定义浮点数(自): 返回self.\u int+self.\u nano*1e-9 定义内部(自我): 返回自我 但是,当我尝试将其转换为numpy.longdouble时,它将通过\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

我有一个自定义类(出于历史原因),它将高精度数字存储为两个整数,分别表示整数部分和纳米精度非整数部分,例如:

类自定义(对象):
定义初始值(自、内部、纳米):
自我。_int=int_
自。_nano=nano_
定义浮点数(自):
返回self.\u int+self.\u nano*1e-9
定义内部(自我):
返回自我
但是,当我尝试将其转换为
numpy.longdouble
时,它将通过
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

>>a=自定义(1234567890123456789)
>>>打印(numpy.longdouble(a))
1234567890.1234567165
>>>打印(numpy.longdouble(浮点(a)))
1234567890.1234567165
>>>打印(numpy.longdool(a._int)+numpy.longdool(a._nano*1e-9))
1234567890.123456789

最后一个例子就是我想要的结果。因此,问题是,如何将强制转换的默认行为重写为
numpy.longdouble

我认为目前还不可行,因为中间
浮动
强制转换是不可避免的(有关详细信息,请参阅)。而
float
type无法保持如此长的十进制数字的精度(请查看详细信息)

一种解决方法是“覆盖”numpy.longdouble函数:

class Custom(object):
    def __init__(self, int_, nano_):
        self._int = int_
        self._nano = nano_

    def __float__(self):
        return self._int + self._nano * 1e-9

    def longdouble(self):
        return numpy.longdouble(a._int) + numpy.longdouble(a._nano * 1e-9)

    def __int__(self):
        return self._int

a = Custom(1234567890, 123456789)
print(a.longdouble())