Python 如何使用属性设置器作为回调

Python 如何使用属性设置器作为回调,python,getter-setter,Python,Getter Setter,我正在使用一个遗留系统,最近为其添加了Python接口。 在我的代码中,我得到的消息包含ASCII字符串,用于在某些包装器类中设置属性。 我想使用字典将“数据标签”映射到属性设置器方法。当消息中遇到相应的数据标签时,每个属性设置器都将用作“回调” 使用显式setter/getter,基本逻辑如下所示: class A(): def __init__(self): self._x = 1.2 def get_x(self): return self

我正在使用一个遗留系统,最近为其添加了Python接口。 在我的代码中,我得到的消息包含ASCII字符串,用于在某些包装器类中设置属性。 我想使用字典将“数据标签”映射到属性设置器方法。当消息中遇到相应的数据标签时,每个属性设置器都将用作“回调”

使用显式setter/getter,基本逻辑如下所示:

class A():
    def __init__(self):
        self._x = 1.2

    def get_x(self):
        return self._x

    def set_x(self, value):
        self._x = value

myA = A()

myTable = {
    'X' : myA.set_x,
}

label, value = get_message()

print(myA.get_x())
# label is 'X', value a float
myTable[label](value)
print(myA.get_x())
这是可行的,但有点难看。我想使用
@属性
装饰器,但是我不知道如何引用字典中的setter方法。 也就是说,以下各项不起作用

class B():
    def __init__(self):
        self._x = 1.2

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

myB = B()

myTable = {
    'X' : myB.x
}

label, value = get_message()

print(myB.x)
# doesn't work as expected
myTable[label] = value
# no change
print(myB.x)
当然,字典定义中对属性
myB.x
的引用调用getter,因此浮点值与“x”键相关联。
myTable[label]=value
赋值只替换这个值,它不调用setter

那么,有没有一种方法可以获取对属性setter的引用,以插入到字典中,然后作为“回调”调用

我查阅了参考资料,但自己也找不出解决办法


或者,我是不是弄错了,应该走另一条路?(欢迎建议)。

要访问实际函数,必须直接访问类上的属性,因此:

In [1]: class B:
   ...:     def __init__(self):
   ...:         self._x = 1.2
   ...:
   ...:     @property
   ...:     def x(self):
   ...:         return self._x
   ...:
   ...:     @x.setter
   ...:     def x(self, value):
   ...:         self._x = value
   ...:

In [2]: B.x.fset
Out[2]: <function __main__.B.x(self, value)>
比如说:

In [6]: my_table = {'X':B.x.fset.__get__(b)}

In [7]: my_table['X']('foo')

In [8]: b.x
Out[8]: 'foo'

这回答了我的问题,谢谢!现在我看到了,通过
my_table['X']('foo')
调用属性setter与使用显式setter/getter(我的第一个示例)基本相同,即在我看来,有点神秘。有没有任何方法可以使用my_table['X']='foo'?@arabu您必须实现自己的映射,覆盖
\uuuuuuu setitem\uuuu
In [6]: my_table = {'X':B.x.fset.__get__(b)}

In [7]: my_table['X']('foo')

In [8]: b.x
Out[8]: 'foo'