我定义了一个我想要基本操作的类,例如 +
、-
,甚至更高级的数学操作,例如 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
对象应用新操作。
但我还希望 numpy
和 math
中的现有函数支持我的 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/