Python 如何使用属性设置器作为回调
我正在使用一个遗留系统,最近为其添加了Python接口。 在我的代码中,我得到的消息包含ASCII字符串,用于在某些包装器类中设置属性。 我想使用字典将“数据标签”映射到属性设置器方法。当消息中遇到相应的数据标签时,每个属性设置器都将用作“回调” 使用显式setter/getter,基本逻辑如下所示: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
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'