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