如何使用不同类中的格式方法?

2024-04-20 04:47:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类,我希望它与我在机器中安装的某个模块中的另一个类具有相同的__format__方法。怎样才能正确地将它“复制”到我的类中,使它的工作方式与我使用模块的类完全相同?你知道吗

Edit:具体地说,我想在自己的类中使用包的uncertainties.UFloat.__format__方法。你知道吗

MCVE公司:

class MyClass:
    def __init__(self, arg):
        self.v, self.u = arg

    def __format__... ?

所以,就像UFloat一样:

>>> '{:L}'.format(uncertainties.ufloat(1, 0.1))
'1 \\pm 0.1'

预期行为应相同:

>>> '{:L}'.format(MyClass(1, 0.1))
'1 \\pm 0.1'

Tags: 模块方法self机器formatdef方式myclass
1条回答
网友
1楼 · 发布于 2024-04-20 04:47:15

单程,如@胡安帕.阿里维拉加提到这里,只需将方法更改为指向OtherClass方法:

MyClass.__format__ = OtherClass.__format__

不过,这是一种相当笨拙的方法。如果是静态方法,我建议使用包装器方法来完成相同的任务:

def __format__(cls, format_str):
    return OtherClass.__format__(format_str)

或者甚至将当前对象转换为另一个类并简单地调用方法(如果是实例方法):

def __format__(self, format_str):
    inst = OtherClass(self, format_str):
    return inst.__format(format_str)

另一种解决方案是找到OtherClass的源代码,或者仔细观察行为,然后从本质上重写功能。通常我会通过查看源代码存储库来实现这一点,但是快速的pypi搜索uncertainties和相关文档并没有显示git存储库可供借鉴的迹象,因此您必须以一种艰难的方式来实现。Python的inspect模块可以帮助查找库的各个组件的源代码,如果这有帮助的话。你知道吗

特别是看一下uncertainties,正如您在问题中提出的那样,库中的ufloat类型似乎使用了AffineScalarFunc的format函数,可以作为uncertainties.UFloat访问。您可以这样做来查看uncertainties.UFloat.__format__的源代码:

>>> import inspect
>>> import uncertainties
>>> source = inspect.getsource(uncertainties.UFloat.__format__)
>>> print(source)

您可以尝试对算法进行反向工程/复制,或者找出如何调整MyClass.__format__以将值传递到uncertainties.UFloat.__format__中,从而不会使另一个类崩溃。我推荐后一种建议。你知道吗

我不打算进一步讨论这个解决方案,因为该方法的代码有459行,我不想弄乱它。你知道吗

相关问题 更多 >