【问题标题】:Sharing global variables between classes in Python在 Python 中的类之间共享全局变量
【发布时间】:2013-12-09 12:22:21
【问题描述】:

我在面向对象编程方面对 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)?

【问题讨论】:

  • 尽可能避免使用全局变量。
  • 如果你要修改有问题的变量,你只需要使用 global 关键字。

标签: python class oop python-2.7


【解决方案1】:

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

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

【讨论】:

  • 只是想知道...为什么“全局”是不好的解决方案?例如 - 我现在正在使用代码,其中会有很多变量(大约 20 个),必须在很多函数 && 类 && 方法中使用。那么-为什么不好-将它们设置为全局变量?然后-什么解决方案:使用类iheritanace(一些父类Main__init__,它将为所有“子”类&&方法设置默认变量?是解决方案吗?PS在我的情况下-所有变量都是@987654323 @,我的意思是 - 他们将在脚本开始时进行设置,并且在完成之前不会更改。
  • 这个答案需要详细说明。
【解决方案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:注意函数中的参数。

【讨论】:

  • 好吧,我想我的问题是我很困惑将变量从一个类调用到另一个类。那将如何运作?请原谅非常简单的问题../.
  • 哦等等,我刚刚想通了。只需将变量保存为 self.x ,然后稍后调用 B.x 即可。感谢您的指导!
  • 我认为你可以在一个类中初始化另一个类。然后使用其函数在另一个类中使用变量。就像class A: def __init__(self): self.another = B()
【解决方案3】:

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

【讨论】:

  • 这就是我试图做的,但是当从一个模块中的一个类调用一个变量到另一个模块时我有点陷入困境。那会采取什么形式?
  • @user22861 您必须创建目标类的实例,例如在其模块中命名为spam(实例,而不是类),例如eggs。在使用按钮的模块中,您将执行from eggs import spam
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多