当标量在左侧时,为什么标量和ndarray之间的运算有效?

时间:2019-04-02 19:06:37

标签: python python-3.x numpy

给定一些类,您可以实现基本的二进制操作(__add____sub__等),并能够执行obj1 + obj2obj1 + 3,但显然原因3 + obj1会失败,因为内置的python类型不太可能处理您的类。

我从没想过这件事,只是想出那件事就是这样,直到我意识到成功完成3 + obj1的例子。例如:

import numpy as np

obj1 = np.array([1,2,3])

3 + obj1
Out[19]: array([4, 5, 6])

如何允许我的类在左侧内置类型的python和右侧对象之间的操作中成功使用?

class DataStruct:
    def __init__(self,x,y):
        self._x = x
        self._y = y

def __add__(self,other):
    if isinstance(other,DataStruct):
        x = self._x + other._x
        y = self._y + other._y
    else:
        x = self._x + other
        y = self._y + other
    return DataStruct(x,y)
def __repr__(self):
    return f'{self._x},{self._y}'


obj1 = DataStruct(1,2)


obj2 = DataStruct(2,4)


obj1 + obj2
Out[33]: 3,6

obj1 + 3
Out[34]: 4,5

3 + obj1
Traceback (most recent call last):

  File "<ipython-input-35-056b6e7e1462>", line 1, in <module>
    3 + obj1

TypeError: unsupported operand type(s) for +: 'int' and 'DataStruct'

1 个答案:

答案 0 :(得分:1)

The magic function you're looking for is __radd__,当您的课程位于加法项的右侧时,它会处理加法。这些__add__函数提供了一整套用于一般处理这些情况的功能,如果您想支持同时处于两个位置的类,则除了 const [student, setStudent] = useState({}); const [classes, setClasses] = useState([]); const [loans, setLoans] = useState([]); useEffect(async () => { const studentData = await fetchStudentData(); const fetchClasses = await fetchClasses(); const fetchLoans = await fetchLoans(); await toggleIsReady(); }, []); 之外,还需要实现这些功能(不假定操作始终是可交换的。