【问题标题】:initializing python class globally?全局初始化python类?
【发布时间】:2011-10-19 21:57:41
【问题描述】:

我有两个文件,其中一个 test.py 是

import new.py

class Test:

    def __init__(self):
        return
    def run(self):
        return 1

if __name__ == "__main__":
    one=Test()
    one.run()

和新的.py

class New:
    def __init__(self):
        one.run()

New()

现在当我运行 python test.py 时出现此错误,

Traceback (most recent call last):
  File "test.py", line 1, in <module>
    import new.py
  File "/home/phanindra/Desktop/new.py", line 5, in <module>
    New()
  File "/home/phanindra/Desktop/new.py", line 3, in __init__
    one.run()
NameError: global name 'one' is not defined

但我想在我的 New 中使用这个实例! 我可以这样做吗?

编辑:

我想在 new.py 中访问 test.py 中的变量来做一些处理并将它们返回给 test.py。这不可能吗?

【问题讨论】:

    标签: python class initialization


    【解决方案1】:

    如果您希望您的 New 类使用您创建的 Test 的实例,您必须将其作为构造函数的一部分传入。

    新的.py

    class New:
        def __init__(self, one):
            one.run()
    

    test.py

    import new
    
    class Test:
        def __init__(self):
            return
        def run(self):
            return 1
    
    
    if __name__ == "__main__":
        one=Test()
        two = new.New(one);
    

    玩弄全局变量是在不知道自己是如何做到的情况下破坏代码的好方法。最好显式传入你要使用的引用。

    【讨论】:

    • 但我希望它们在两个不同的文件中!!我想在 new.py 中访问 test.py 中的变量来做一些处理并将它们返回给 test.py。这不可能吗?
    • @pahnin:你可以把它们放到不同的文件中,这恰好是我第一次写它的方式。见编辑。
    【解决方案2】:

    不,你不能。你能得到的最接近的是将你需要的东西传递给构造函数:

    class New(object):
        def __init__(self, one):
            one.run()
    

    【讨论】:

    • 你可以,但你不应该;-)
    • @ms4py:是的,好点。我想说点什么。依赖树中的循环很有趣,但不好。
    【解决方案3】:

    oneif __name__=='__main__' 块内定义。 因此,只有当test.py 作为脚本运行(而不是导入)时,one 才会被定义。

    要让模块new 访问test 模块中的one,您需要将one 拉出if __name__ 块:

    test.py:

    class Test:
        def __init__(self):
            return
        def run(self):
            return 1
    
    one=Test()
    
    if __name__ == "__main__":
        one.run()
    

    然后通过限定名test.one访问one

    new.py:

    import test
    
    class New:
        def __init__(self):
            test.one.run()
    
    New()
    

    【讨论】:

    • 但它与初始 one() 的实例不同,我的意思是如果我对初始变量中的一个变量进行了一些数学运算,该变量将无法从新的 importin new.py 访问
    • 在模块级别共享状态不是一个好主意。 @unholysampler 通过传递参考发布了“正确”的解决方案。
    • @pahnin:它相同的one。试试看。
    猜你喜欢
    • 2017-06-17
    • 1970-01-01
    • 2011-07-20
    • 2011-10-08
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多