我只是好奇 numpy 如何實作其標量乘法。在我的理解中,
x * y 呼叫__mul__x,的方法x.__mul__(y)。
這將如何與此代碼一起使用:
x = 6
y = np.array([1,2])
print(x * y)
代碼不會呼叫x.__mul__(y)嗎?而且由于 x 不是一個 numpy 變數,numpy 如何控制它的行為方式?
uj5u.com熱心網友回復:
當 Python 遇到x * y它時,它確實會首先呼叫(1)。如果任何此類方法不知道如何處理它收到的運算元,則它可能會回傳。這是什么:x.__mul__(y)NotImplementedx.__mul__(y)
>>> x = 6
>>> y = np.array([1, 2])
>>> x.__mul__(y)
NotImplemented
然后,作為下一步,Python 呼叫反射的運算元方法__rmul__,即y.__rmul__(x):
>>> y.__rmul__(x)
array([ 6, 12])
因此,在這第二步中,由np.ndarray班級來確定此操作(2) 的結果。
這也可以在自定義測驗類的幫助下可視化:
>>> class Test:
... def __rmul__(self, other):
... print('__rmul__', self, other)
...
>>> x = 1
>>> y = Test()
>>> x.__mul__(y)
NotImplemented
>>> x * y
__rmul__ <__main__.Test object at 0x7f46c6acb668> 1
(1) 除非type(y)是 的子類,type(x)在這種情況下y.__rmul__(x)優先于x.__mul__(y)。
(2) 如果兩個方法x.__mul__和 都y.__rmul__回傳,NotImplemented則 aTypeError被引發。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/361996.html
