Python:修改模块外部的类变量无效

时间:2018-01-31 17:10:33

标签: python class types module reference

我正在尝试创建一个系统,我可以尽可能轻松地改变A的值。当我将A导入各种其他模块并修改A的字段时 它们似乎在外国模块中保持不变,但在A的原生模块中没有变化。

# module name a.py

import b

class A:
    x = 0

    @classmethod
    def call_mutate_A_from_B(cls):
        b_object = b.B()
        b_object.mutate_A() # change does not seem to stay in effect upon 
                            # return

        print(cls.x) # prints 0

def main():
    A.call_mutate_A_from_B()

if __name__ == '__main__':
    main()


# module name b.py

from a import A

class B: # in a different module
    def mutate_A():
       A.x = 2

这是预期的行为吗?我不这么认为。我应该创建A的对象表示,而不是将其视为静态类吗?

1 个答案:

答案 0 :(得分:0)

回答你的第一个问题:是的,这是预期的行为。让我们说模块A由另一个模块B导入。当我们import A时,会发生两件事:

  • 导入的模块A的所有对象定义都导入到B。

  • A中的任何可执行语句都会执行(只执行一次)。

为了详细说明第一点,A中的类,函数,变量等的所有定义都被导入到B中。可以说B现在有自己的模块A内容的工作副本可供使用。更改这些副本的任何方面会对原始定义产生任何影响,这意味着这些更改将反映在A(导入的模块)中。

我希望这能解决你的问题。您可以在official Python docs中阅读有关模块如何工作的更多信息。