跨模块和全局变量导入Python

2024-09-29 21:23:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个很基本的问题,但我似乎找不到任何帮助。

file_a.py >>

from xyz import XYZ
class A:
    .
    .
    .

file_b.py >>

import file_a
from file_a import A
class B(A):
    def __init__(self):
        A.__init__(self)

    def someMethod(self):
        XYZ.doSomething()

doSomething()未能说出名称错误:未定义名称“XYZ” 即使是从文件a完成的标准导入(如“import sys”)似乎也无法使其在文件b中可用。我认为这应该可以工作。我的理解错了吗?如果是,那么有没有一种方法可以跨文件使用公共导入和全局变量?(如果它不需要帮助,我就成为C++和java程序员,现在开始使用Python。)


Tags: 文件frompyimportself名称initdef
3条回答

是的,你的理解错了。每个模块都是其自己的命名空间,只有在该文件中显式导入的内容才能在该命名空间中使用。

与其他答案相反,虽然这会起作用,但提到file_a.XYZ并不是特别的Python。相反,您应该导入位于file_b顶部的XYZ和sys。

导入模块时,该模块中定义的所有变量都在其命名空间中可用。因此,如果XYZfile_a模块中可用,则当您import file_a时,可以将XYZ作为file_a.XYZ访问。

这里的一般思想是,您的名称空间不应该与其他名称空间的内容混淆。

Is my understanding wrong?

是的,因为行from file_a import A只将类A导入到file_b的命名空间中。file_a的名称空间是单独的。如果不是这样的话,两种语法都没有什么意义:

import modulename
from modulename import something

如果你的想法是正确的,那么在第二个表单之后,你总是可以使用modulename.someotherthing

If yes, then is there a way to have common imports and global variables across files?

是的,使用星号*运算符:

from modulename import *

但是这带来了名称空间污染的问题,例如from file_a import *将在file_b中导入,也会在file_a中导入所有的导入。你最终会失去对进口的控制,这会在某个时候咬你一口。。。相信我!

当出于某种原因需要from module import *时,命名空间污染的解决方法是在module中定义variable ^{},其中列出了应该使用star运算符导入的内容。

啊!

相关问题 更多 >

    热门问题