2013-11-24 79 views
5

我对python的面向对象编程思维比较陌生,它对我来说相对来说比较慢。在Python中的类之间共享全局变量

是否有可能在具有多个函数的类之间传递全局变量?我在这里和其他来源广泛阅读了他们,但我仍然有点困惑。

我的最终目标是全局定义一个变量,在一个类的函数中为它赋值,然后在另一个类的函数中使用它。那可能吗?我正在为ArcMap构建一个pythonaddin,每个按钮都需要一个类。我想要一个按钮来为变量赋值,然后在脚本的另一个类中使用该变量。

(之前我得到了高射炮,我知道这是比较不好的形式在第一时间使用全局变量,我努力学习)

例如,作为一个高度简化的例子:

x = [] 

class A(): 

    def func_1(self): 
     #populate the x variable 
     global x 
     x = 1 


class B(): 

    def func_2(self): 
     global x 
     #do stuff with x 

这是可以接受的(即使不pythonic)?

+0

尽可能避免使用全局变量。 –

+0

如果要修改相关变量,则只需使用全局关键字。 –

回答

1

是的,它是可能。你的代码几乎是正确的,只是在函数定义中缺少一些括号。除此之外,它的作品。

现在,是可以接受?在99%的案例中,不,事实并非如此。在类之间传递变量和共享数据有很多种方法,使用全局变量是最糟糕的一种,如果不是最差的

+1

只是想知道......为什么'全局'是不好的解决方案?例如 - 我现在用代码工作,其中将有很多变量(大约20),这些变量必须用在很多函数&&类&&方法中。那么 - 为什么它不好 - 把它们设置为全局变量?然后 - 什么解决方案然后:使用类iheritanace(一些父'Main'类与'__init__',它将为所有'子类'&&方法设置默认的var?它是解决方案吗?PS在我的情况 - 所有var的将是'const ',我的意思是 - 当脚本开始的时候,他们一定会安装好的,直到完成后才会修改。 – setevoy

2

是的,它可以工作。以下是修改后的代码:

x = [] 

class A: 
    def func_1(self): 
     #populate the x variable 
     global x 
     x.append(1) 
class B: 
    def func_2(self): 
     global x 
     print x 

a = A() 
a.func_1() 
b = B() 
b.func_2() 

它可以正确打印列表x。如果可能的话,你应该尽量避免全局变量。您可以使用许多其他方式更安全有效地在类之间传递变量。 PS:注意函数中的参数。

+0

好吧,我想我的问题是,我把变量从一个类调用到另一个类时会感到困惑,这将如何工作?简单的问题../。 – user22861

+0

哦,等等,我只是想出了它。这只是一个保存变量为self.x然后再调用Bx的问题感谢您的指导! – user22861

+0

我认为你可以初始化另一个类在一个然后在另一个类中使用它的函数来使用变量,就像'class A:def __init __(self):self.another = B()' –

2

更多的Pythonic解决方案是让按钮对象(在处理“press”事件的方法中)设置属性或调用任何对象需要信息的方法。

+0

这就是我想要做的,但是当从一个模块的类中调用一个变量到另一个模块时,我陷入了一些困境。这需要什么形式? – user22861

+0

@ user22861您必须创建目标类的实例,例如在其模块中命名为'spam'(实例,不是类) 'eggs'。在使用这些按钮的模块中,您将从'''''''进口垃圾邮件'。 –

相关问题