我们在使用 numpy 的时候, 经常切片操作, 怎么实现的呢:
python">t = np.array([1, 2, 3, 4, 5])
print(t[1:2], type(t[1:2]), type(t))
我们可以很容易在python 官网上查到这是使用了 __setitem__
,__getitem__
内置函数.
除了内置函数, 还需要做点操作. 下面是我写的一个二进制操作类的雏形, 供大家参考:
python">import math
class A():def __init__(self, value=1):if isinstance(value, int):self.vals = [value]else:self.vals = valueself.it_s = None self.it_e = None def __add__(self, other):return self.vals[0] + otherdef __sub__(self, other):return self.vals[0] - otherdef __setitem__(self, key, value):self.vals[0] = (self.vals[0] & ((~((1 << (key.stop-key.start))-1))<<key.start)) \| ((((1 << (key.stop-key.start))-1)&value)<<key.start)def __getitem__(self, key):k = A(self.vals)k.it_s = key.startk.it_e = key.stopreturn kdef __str__(self):s = 0 if self.it_s is None else self.it_se = math.ceil(math.log2(self.vals[0])) if self.it_e is None else self.it_e return str((self.vals[0] & ((1 << e) - 1))>> s)
测试调用方法:
python">a = A(100)
a[1:2] = 3
print(f'a[1:2] ={a} {a[1:3]} {type(a[1:3])}')
输出:
$ python test/t_slice.py
a[103 3 <class '__main__.A'>
有点其他事情要外出, 没来得及验证, 我也是分享一下思路, 有问题评论区指出.