如何设置代理对象的可下标属性的元素值

问题描述 投票:1回答:1

我使用此stackoverflow question尝试实现一个manager对象,该对象将管理自定义对象的属性的编写。我知道我需要通过在代理类中定义__getattribute__来公开__setattr____delattr___exposed_等魔术方法。但是,当我尝试设置自定义对象的可下标属性的元素的值时,它的值保持不变。

查看multiprocessing文档,在任何地方都找不到multiprocessing.managers子类NamespaceProxy(在上述文章中提到)。我可以一方面将其导入;但是,我有一个令人怀疑的地方,就是它没有正确实施。

这是我尝试更改归因于自定义类对象的数组元素的值的方法:

from multiprocessing.managers import BaseManager, NamespaceProxy
import numpy as np

class TestClass(object):
   def __init__(self, a):
       '''
       Args:
           a (np.ndarray): the array that needs to be changed  
       '''
       self.a = a

class TestProxy(NamespaceProxy):
    # exposes the magic methods for TestProxy objects needed for setting their attributes
    _exposed_ = ('__getattribute__', '__setattr__', '__delattr__')

class MyManager(BaseManager):
    pass

if __name__ == '__main__':
    MyManager.register('test', TestClass, TestProxy)
    manager = MyManager()
    manager.start()

    arr = np.array([0,0,0,0])
    managed_obj = manager.test(arr)
    managed_obj.a[0] = 1

    print(managed_obj.a)

# Console: [0 0 0 0]

# Expected ouput: [1 0 0 0]

编辑:我可以用类似]的方法更改a的实际值

arr2 = np.array([0])
managed_obj.a = arr2
print(managed_obj.a)

# Console : [0]

但是,我仍然不知道如何更改a元素的值。

我使用了这个stackoverflow问题来尝试实现一个管理器对象,该对象将管理自定义对象的属性的编写。我知道我需要公开魔术方法,如...

python proxy attributes multiprocessing python-3.7
1个回答
0
投票

我还没有弄清楚如何(或是否)可以通过某种通用的__setitem__方法使它起作用(这是我最初的目标,但下面是定义出现的自定义方法(以下称为my_setitem())的方法以能够更改数组中索引元素的值。

© www.soinside.com 2019 - 2024. All rights reserved.