在Python中的类之间共享全局变量

在Python中的类之间共享全局变量,python,class,oop,python-2.7,Python,Class,Oop,Python 2.7,从面向对象编程的角度来看,我对python的认识相对较新,而且对我来说,它的发展相对较慢 是否可以在包含多个函数的类之间传递全局变量?我已经在这里和其他来源广泛阅读了关于它们的内容,但我仍然有点困惑 我的最终目标是全局定义变量,在一个类的函数中为其赋值,然后在另一个类的函数中使用它。可能吗?我正在为ArcMap构建一个pythonaddin,它要求每个按钮都有一个类。我希望有一个按钮为变量赋值,然后在脚本的另一个类中使用该变量 (在我被高射炮轰之前,我知道首先使用全局变量是一种相对糟糕的形式,我

从面向对象编程的角度来看,我对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

这是否可以接受(即使不是肾盂的)?

是的,这是可能的。您的代码几乎正确,只是在函数定义中缺少几个括号。除此之外,它还能工作


现在,这可以接受吗?在99%的情况下,不是这样。在类之间传递变量和共享数据的方法有很多,而使用全局变量即使不是最糟糕的,也是最糟糕的方法之一。

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

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
。如果可能,您应该尽量避免使用全局变量。您可以使用许多其他方法在类之间更安全、更有效地传递变量


注意函数中的参数

一个更具python风格的解决方案是让button对象(在其处理“press”事件的方法中)设置属性或调用任何需要信息的对象的方法。

尽可能避免全局变量。如果要修改相关变量,只需使用全局关键字。这就是我试图做的,但当我从一个模块中的类调用变量到另一个模块中时,我有点陷入困境。这将采取什么形式?@user22861您必须在其模块中创建目标类的实例,例如名为
spam
(实例,而不是类),例如
egs
。在使用按钮的模块中,您将从Oggs import spam执行
。好吧,我想我的问题是,将变量从一个类调用到另一个类时会感到困惑。那怎么办?请原谅我提出了一些非常简单的问题../。哦,等等,我刚想出来。只需将变量保存为self.x,然后稍后调用B.x即可。谢谢你的指导!我认为您可以在一个类中初始化另一个类。然后使用另一个类中的变量并使用其函数。就像
类A:def\uuuu init\uuuuuu(self):self.other=B()
只是想知道。。。为什么“全球”是糟糕的解决方案?例如,我现在正在处理代码,它将有很多变量(大约20个),这些变量必须在很多函数、类和方法中使用。那么-为什么不好-只是将它们设置为全局变量?那么,什么解决方案:使用iHeritance类(一些父类
Main
带有
\uuu init\uuuu
,将为所有“子”类和方法设置默认var?这是解决方案吗?在我的例子中,所有var都将是
const
,我的意思是-它们将在脚本启动时启动,直到完成才更改。这个答案需要详细说明。