python对浮点、int等的引用

python对浮点、int等的引用,python,reference,Python,Reference,据我所知,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 handleTextEvent(self,event): if (event.GetEventObject() == widget1): a=int(ev

据我所知,python中没有对
int
s或
float
s或类似数据的引用。然而,我正在研究一个问题,如果我能做一些类似的事情,我会非常方便

a=1
b=2
c=3
ref_dict={'field1':ref_to_var_a,'field2':ref_to_var_b,'field3':ref_to_var_c}
def handleTextEvent(self,event):
    if (event.GetEventObject() == widget1):
       a=int(event.GetString)
    elif (event.GetEventObject() == widget2):
       b= ....
然后

def update(field,value):
   ref_dict[field]=value
因此,如果用户调用

update('field2',5)
b
的值将变为5

有什么办法可以做到这一点吗?谢谢

作为对阿尔巴内特有用的评论和回答的回应,我真正想做的是——惊喜,惊喜——更复杂。我正在用wxPython构建GUI。我有许多TextCtrl控件,每个控件都将设置一个变量的值。当然,我可以为每个控件编写一个方法,也可以编写一个方法,就像

a=1
b=2
c=3
ref_dict={'field1':ref_to_var_a,'field2':ref_to_var_b,'field3':ref_to_var_c}
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的新手

谢谢

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

假设
a
b
c
是全局变量:

ref_dict = {'field1': 'a', 'field2': 'b', 'field3': 'c'}
def update(field, value):
    globals()[ref_dict[field]] = value

如果您真的愿意,您甚至可以创建“引用包装器”:

如果您想包装不在
全局文件中的内容,比如来自另一个模块的全局文件、类属性、实例属性等。?创建更多引用包装器类型:

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、模型模板视图或其他变体(这里您并不真正需要控制器)


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

如果您说明了为什么这样做比较方便,那么回答起来会更容易,因为答案可能是“您真的不想这样做”。关键是要强制您从合理的数据结构开始—如果您真的想编写此代码,它将看起来像
structure.update('field',5)
@JochenRitzel:+1。但是大多数时候,只要
structure.field=5
就更好了……字典的
update
方法呢?您可以从键和新值创建一个并调用它吗?@bob.sacamento:但是,如果您通常通过名称动态访问这些属性,并且只是偶尔使用普通属性访问,那么您可能只想将它们粘贴在
dict
中,作为模型公共界面的一部分,因此它只是
self.model.thingies[field]=value
。但是,只有当
a
b
等与
update
在同一个模块中定义时,这才有效,因此它仍然不是真正的引用操作。@mgilson:如果它们是另一个模块中的全局变量,则执行
setattr(其他模块,ref\u dict[field],value)
。您可以对类属性、实例属性等执行类似的操作。您甚至可以使用简单的GlobalReference、LocalReference、namespacerence等类来包装这些操作,并传递它们。