据我了解,python中没有对int
或float
或类似数据的引用。不过,我正在研究一个问题,如果我可以做一些像
a=1
b=2
c=3
ref_dict={'field1':ref_to_var_a,'field2':ref_to_var_b,'field3':ref_to_var_c}
然后
def update(field,value):
ref_dict[field]=value
所以如果用户打电话
update('field2',5)
b
的值将变为5。
有什么办法可以做到吗?感谢。
回应arbanert的有用评论和回答,我真正想做的是 - 惊喜,惊喜 - 更复杂。我正在使用wxPython构建GUI。我有很多TextCtrl控件,每个控件都会设置一个变量的值。当然,我可以为每个控件编写一个方法,或者我可以编写一个类似于
的方法def handleTextEvent(self,event):
if (event.GetEventObject() == widget1):
a=int(event.GetString)
elif (event.GetEventObject() == widget2):
b= ....
我想你也明白为什么我也不喜欢这个。如果我可以做一个简短的功能,那将是很好的:
def handleTextEvent(self,event):
ref_dict[event.GetEventObject()]=int(event.GetString())
而且,是的,我对wxPython很新。
谢谢!
答案 0 :(得分:2)
这可能,但这几乎总是一个坏主意。
假设a
,b
和c
是全局的:
ref_dict = {'field1': 'a', 'field2': 'b', 'field3': 'c'}
def update(field, value):
globals()[ref_dict[field]] = value
如果真的想要,你甚至可以创建“参考包装器”:
class GlobalReference(object):
def __init__(self, name):
self.name = name
def get(self):
return globals()[self.name]
def set(self, value):
globals()[self.name] = value
ref_dict = {'field1': GlobalReference('a'), 'field2': GlobalReference('b')}
def update(field, value):
ref_dict[field].set(value)
如果你想包装不在globals
中的东西,比如来自另一个模块的全局变量,类属性,实例属性等等?创建更多参考包装类型:
class NamespaceReference(object):
def __init__(self, namespace, name):
self.namespace, self.name = namespace, name
def get(self):
return getattr(self.namespace, self.name)
def set(self, value):
setattr(self.namespace, self.name, value)
ref_dict = {'field1': GlobalReference('a'), 'field2': NamespaceReference('myobj', 'b')}
或者你可以放弃课程并只存储setter函数......
所以,如果这是一个坏主意,那么正确的答案是什么?
不知道你想做什么,很难说,但这里有一些可能性:
dict
变量而不是一堆单独的变量。对于你的具体情况,我认为你想要的是第二个。这是标准的模型 - 视图 - 控制器设计。或者,如果您不喜欢MVC,模型模板视图或其他一些变体(这里您不需要控制器)。
你的模型是一堆分散的全局变量,这就是为什么很难将它连接到视图的原因。最简单的答案是将模型表示为对象。然后给视图(或其控制器)一个对这个模型的引用,这是微不足道的,你就完成了。