直接挂钩在类上设置属性是非常简单的.

class A(object):

        def __setattr__(self, key, value):
               print(f'__setattr__: {key} = {value}')
               super(A, self).__setattr__(key, value)

        def __getattribute__(self, key):
               print(f'__getattribute__: {key}')

a = A()
a.attribute = np.array([1,2,3])
__setattr__: attribute = [1 2 3]

这会捕获属性的直接设置,但不会捕获数组的更改.

当前行为:

a.attribute[2] = 5
__getattribute__: attribute

我正试着捕捉数组的变化.我对此的Python实现的理解是,数组是从类返回的,然后单独修改,所以这是不可能的.但想确认一下.

推荐答案

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

Python相关问答推荐

numpy.unique如何消除重复列?

python—telegraph—bot send_voice发送空文件

如何在Python中使用Iscolc迭代器实现观察者模式?

使用Python异步地持久跟踪用户输入

Python Mercury离线安装

在我融化极点数据帧之后,我如何在不添加索引的情况下将其旋转回其原始形式?

如何防止html代码出现在quarto gfm报告中的pandas表之上

如何在Django模板中显示串行化器错误

修改.pdb文件中的值并另存为新的

对数据帧进行分组,并按组间等概率抽样n行

GEKKO中若干参数的线性插值动态优化

滚动加权平均(或类似)填充失踪大Pandas

如何让Pandas 数据帧变长变宽

编撰词典的功能

从html获取元素时出现问题

NetCDF:使用MSWEP再分析数据集计算沿所有坐标的年降水量总和

压平JSON后的Pandas 保留柱

在TKinter中将列表显示为多行标签

如何用绘图仪绘制地球轨道图?

回收Python对象ID对Pickler来说会是个问题吗?