[英]How do I make existing functions in math and numpy module support user-defined objects?
我定義了一個我想要基本操作(例如+
, -
)以及更高級的數學操作(例如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
始終返回浮點數。 如果要讓math.sin(your_object)
返回一個NewObj
實例而不是float
, 請不要這樣做 。 如果您使它工作,它將使所有人感到困惑,並且將導致初始化順序錯誤和其他麻煩。 (這是NumPy有其自己的numpy.sin
而不是試圖使math.sin
支持NumPy數組的原因。)
如果您對math.sin(your_object)
返回浮點數沒問題,那么可以實現__float__
方法將您的對象轉換為浮點數:
class NewObj(object):
...
def __float__(self):
return whatever
math.sin
會將您的對象轉換為浮點數,計算該浮點數的正弦值,然后將其作為浮點數返回。
對於NumPy,只需實現一個sin
方法:
class NewObj(object):
...
def sin(self):
return whatever
numpy.sin
將委托給您的sin
方法。 您可以讓它返回一個NewObj
; 無需強制浮動或其他任何操作。 大多數類似的NumPy函數將類似地委托給方法。 也就是說,嘗試在NumPy數組中使用自定義對象會削弱NumPy的大多數效率優勢,因此,如果要這樣做,您可能需要重新考慮設計。
您可以重新定義math
模塊的sin
。
import math
class NewObj:
pass
old_sin = math.sin
def new_sin(number):
return 42.0 if isinstance(number, NewObj) else old_sin(number)
math.sin = new_sin
大概您用一個更有用的定義替換了42.0
。
希望在不久的將來不會出現__numpy_ufunc__
特殊屬性(名稱可能會更改 )。 這是numpy docs 開發版本中的相關內容
class.__numpy_ufunc__(ufunc, method, i, inputs, **kwargs)
1.11版中的新功能。
任何類( 無論是否為ndarray子類 )都可以定義此方法來覆蓋NumPy的ufunc的行為。
[強調我的]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.