0

据我了解,python 中没有对ints 或floats 或类似数据的引用。尽管如此,我正在解决一个问题,如果我能做类似的事情对我来说会很方便

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 很陌生。

谢谢!

4

1 回答 1

2

可能的,但这几乎总是一个坏主意。

假设a,bc是全局变量:

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 函数……</p>


那么,如果这是一个坏主意,那么正确的答案是什么?

不知道你想做什么,很难说,但这里有一些可能性:

  • 使用一个dict充满值的变量而不是一堆单独的变量。
  • 使变量成为类的实例属性,并传递该类的实例。
  • 使用可变的浮动持有者对象而不是普通的浮动实例。

对于您的具体情况,我认为您想要的是第二个。这是标准的模型-视图-控制器设计。或者,如果您不喜欢 MVC、model-template-view 或其他一些变体(您实际上并不需要控制器)。

您的模型是一堆分散的全局变量,这就是为什么很难将其连接到视图的原因。最简单的答案是将模型表示为对象。然后给视图(或其控制器)一个对该模型的引用,这很简单,你就完成了。

于 2013-04-11T23:22:04.967 回答