类A
存储的不是对象本身,而是对数组的引用.因此,当您将索引attribute
设置为5时,实际上并不是在编辑a.attribute
,因此不会执行对__setattribute__
的调用.在这种情况下,A
个对象所做的是通过访问解释器自己的属性为解释器提供数组引用(实际上,调用了定制的__getattribute__
);但是,数组修改涉及ndarray
类问题.
您可以使用一些变通方法来实现这一点,但在计算和开发方面都有显著的开销.
最简单的方法是始终防止用户修改数组:使用中间层方法修改array.这是迂腐的,很难实现,而且使用数组切片会损失很多直接的facilities.
一方面,您可以使用memmap
在文件上写入映射数组,同时,您可以使用框架(例如Qt QFileSystemWatcher)来通知文件更改.问题是,简单的赋值是不够的,您必须在每次更改数组时刷新它.
另一方面,您可以创建一个观察器线程,它持续(和异步地)查看您的数组并存储它的副本,类似于(仅用于说教目的!必须在主线程中实现孪生部分才能接收事件)
from threading import Thread, Event
from time import sleep
class watcher(Thread):
def __init__(self, array_to_be_watched):
self.array_changed = Event()
self.active = True
self.array = array_to_be_watched
def run(self):
while self.active:
array = self.array.copy()
# determines how frequently you'd like to check
sleep(0.01)
if np.array_equal(self.array, array):
# To be cleared when caught on main loop
self.array_changed.set()
关于Event的更多信息
一些缺点:checking the array is a CPU demanding task. Multithreading is not really efficient for this option.你应该保持睡眠时间不那么低!
您最好使用多处理,但对于使用共享内存或类似内存的更复杂的体系 struct ,您应该考虑到IPC中的延迟.
一些您可能感兴趣的其他技术here