python - 如何使 math 和 numpy 模块中的现有函数支持用户定义的对象?

标签 python oop numpy math magic-methods

我定义了一个我想要基本操作的类,例如 +-,甚至更高级的数学操作,例如 sin支持。也就是说,我需要为这些基本运算符和数学函数定义一些新规则。

我可以使用 Python 的魔术方法处理基本运算符,如下所示,

class NewObj():

    def __init__(self, *args):
        pass

    def __add__(self, other):
        pass

    def __mul__(self, other):
        pass

    # Use magic methods to define other basic operators below...

我还可以在定义类 NewObj 的同一个 .py 文件中重新定义基本函数,例如

def sin(x):
    pass

并将此文件命名为,比方说,myoperator.py。然后我可以导入这个模块并对 NewObj 对象应用新操作。


但我还希望 numpymath 中的现有函数支持我的 NewObj 对象,以便 math.sin()numpy.sin() 也支持我新定义的 NewObj 对象。我怎样才能做到这一点?

另一个问题是:是否可以像魔术方法一样将函数封装在我的 NewObj 类中,以便所有内容都写入类数据结构中?

最佳答案

math模块显式记录功能类似于 math.sin总是返回花车。如果你想要math.sin(your_object)返回 NewObj实例而不是 float , 不要那样做。即使你让它工作,它也会让每个人都感到困惑,它会导致初始化顺序错误和其他令人头疼的问题。 (NumPy 有自己的 numpy.sin 而不是试图让 math.sin 支持 NumPy 数组是有原因的。)

如果您同意 math.sin(your_object)返回一个 float ,然后实现一个 __float__将对象转换为 float 的方法:

class NewObj(object):
    ...
    def __float__(self):
        return whatever

math.sin会将您的对象转换为 float ,计算 float 的正弦值,并将正弦值作为 float 返回。


对于 NumPy,只需实现 sin方法:

class NewObj(object):
    ...
    def sin(self):
        return whatever

numpy.sin将委托(delegate)给您的sin方法。你可以让它返回 NewObj ;没有必要转换到 float 或任何东西。大多数类似的 NumPy 函数将类似地委托(delegate)给方法。也就是说,尝试在 NumPy 数组中使用自定义对象会破坏 NumPy 的大部分效率优势,因此如果您想这样做,您可能需要重新考虑您的设计。

关于python - 如何使 math 和 numpy 模块中的现有函数支持用户定义的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42183311/

相关文章:

python - HTML 覆盖表格元素以不显示任何内容

java - 当从 Python 调用 jar 时,如何最小化 JavaVM 的加载时间?

php - 关于 PHP 中 OOP 的使用,这是正确的吗?

oop - 返回接口(interface)时返回更少/更具体的接口(interface)的 OO 最佳实践

java - Kotlin /Java : should this singleton object have these sub-methods to check?

python - 匹配字符串中的字符 "/"

python - 这可能涉及 namespace ,但我无法弄清楚为什么在一个示例中找不到该名称,但在另一个示例中找到了

python - 根据列的值连续性按行拆分/分组 pandas DataFrame

python - 为什么这个点积会产生尺寸误差?

python - 在 python 中倾斜或剪切图像