给定一些类,您可以实现基本的二进制操作(__add__
,__sub__
等),并能够执行obj1 + obj2
或obj1 + 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'
答案 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();
}, []);
之外,还需要实现这些功能(不假定操作始终是可交换的。