麻烦的是一个类中的变量范围?

时间:2012-07-24 04:22:58

标签: python scope pybrain

所以我正在使用Python创建一个类(使用pybrain)创建一个网络(使用pybrain),只使用它给出的数字输入{只是一个小小的过程让我的脚在Pybrain的API中弄湿}。

我的问题是,我不太熟悉范围在类中的工作方式,虽然我基本上已经正确设置了程序,但它仍然会返回一个关键错误。

需要采取行动的所有变量都是在 init 函数中创建的;我正在为该类工作的方法是尝试调用其中一个变量,使用Python中的vars()[]方法在 init 函数中声明。 (你实际上可以在这里看到代码的一部分......草稿: Matching Binary operators in Tuples to Dictionary Items

无论如何,方法是:

    def constructnetwork(self):
    """constructs network using gathered data in __init__"""
       if self.recurrent:
            self.network = pybrain.RecurrentNetwork  
            #add modules/connections here
       elif self.forward:
            self.network = pybrain.FeedForwardNetwork
       else:
            self.network = pybrain.network

       print vars()[self.CONNECT+str(1)]
       print vars()[self.CONNECT+str(2)]
       print self.network

(原谅糟糕的间距,它没有复制并粘贴好。)提出KeyError的部分是“print vars()[self.CONNECT + str(1)],它应该检索值变量“Connection1”(self.CONNECT ='Connection'),但调用了一个keyerror。

如何让变量转移过来?如果您需要更多信息来帮助提问,我试图尽可能缩短问题。

1 个答案:

答案 0 :(得分:2)

vars()返回对 local 变量字典的引用。如果您在vars()中使用__init__(作为您链接到的帖子中的代码建议),那么您只是在该方法中创建了一个局部变量,该变量无法从该方法之外的任何位置访问。

您认为vars()做了什么,您想做什么?我希望你想要的是getattrsetattr,或者只是字典,而不是vars

编辑:根据您的评论,听起来确实不应该使用vars。你会在__init__做更好的事情,比如:

 self.connections = {}
 self.connections[1] = "This is connection 1"

然后在你的方法中,执行:

 self.connections[1]

但这只是基于您的代码的模糊猜测。我无法确切地告诉你这个“连接”是什么意思。你想要它是与你的对象相关的一些数据吗?