2011-12-28 39 views
2

这可能是一个愚蠢的问题,但并不太确定还有什么要做。如何导入另一个外部python模块?

main.py

import module2 
global x 
hello="Hello" 
x=module2.message() 
x.say() 

module2.py

class message: 
    def say(): 
     print hello 

当我打印您好,我指的是你好变量main.py但是这种方法会返回一个错误。有谁知道解决方案? (我不希望将hello变量输入到函数中)

回答

3

唯一可靠的解决方案称为封装

所以,基本上,你可以改变你的代码看起来像:

main.py

import module2 

global x 
hello="Hello" 
x=module2.message(hello) 
x.say() 

module2.py

class message: 
    def __init__(self, hello): 
     self.hello = hello 
    def say(): 
     print self.hello 

另外尽量遵循的Python的编码风格 - 您和您的代码的未来开发人员的生活会更容易。

+0

啊是的,我真的不想使用这种方法,但我认为这是唯一的选择。 – thelost 2011-12-28 20:30:22

2

多个选项,但请注意,一个模块不能直接访问调用模块。

  1. 只需通过hello作为变量(def say(msg): print msg
  2. 通行证在main.pymodule2所有变量:def say(g): print g['hello']say(globals())
  3. 存储在某个地方,然后提取它,当你需要它。
1

由于main.py进口module2.py,您可以访问main中定义的全局变量moule2。

在你的情况下,因为module2没有导入main,所以main中的全局变量不能在module2中访问。

了一个解决方案,通过@Tadeck

1

定义。在这个特殊的例子,它是完全OK了module2.py进口main.py,也有一些疑难杂症的虽然。

最明显的是,main.py可能是从命令行运行的,如python main.py,它的作用是使该文件认为它被称为__main__。你可以在module2中导入这个模块,但这是不寻常的;它被称为“main.py”,你想import main。这样做会导致模块第​​二次导入

对于要确定,你必须为导入文件有没有副作用除非它导入为__main__安排。 python中一个非常常见的习惯用法是在模块结束时测试该条件。

import module2 
global x 
hello="Hello" 

def main(): 
    x=module2.message() 
    x.say() 

if __name__ == '__main__': 
    main() 

而现在module2.py实际进口main它只是罚款。另一方面,将变量从一个模块导入另一个模块难以预测何时可以递归导入,您可能还没有该变量,因为该模块已经试图导入。另一方面,使用虚线语法在模块中引用变量总是安全的。所以,你的module2.py应该是:

import main 
class message: 
    def say(): 
     print main.hello 

这也使得它更加明显流向何方hello是从哪里来的。

相关问题