我们在使用 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'>

有点其他事情要外出, 没来得及验证, 我也是分享一下思路, 有问题评论区指出.

04-22 13:44