Python跨模块和全局变量导入

发布于 2021-01-29 14:11:10

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

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()

XYZ.doSomething()无法说出NameError:未定义名称“ XYZ”即使从file_a完成的标准导入(如“ import
sys”)似乎也无法使其在file_b中可用。我以为应该工作。我的理解错了吗?如果是,那么是否有办法在文件之间具有通用的导入和全局变量?(如果没有帮助,我曾经是C
++和Java程序员,现在开始使用python。)

关注者
0
被浏览
136
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我的理解错了吗?

    是的,因为该行from file_a import A仅将类A导入的名称空间file_b。的名称空间file_a不予处理。如果不是这样,则两种语法都没有意义:

    import modulename
    from modulename import something
    

    好像您的想法是正确的,那么在第二种形式之后,您将始终可以使用modulename.someotherthing

    如果是,那么是否有办法在文件之间具有通用的导入和全局变量?

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

    from modulename import *
    

    但这带来了名称空间污染的问题,例如from file_a import *还将导入在中file_b完成的所有导入file_a。您最终
    失去对进口的控制,这会在某些时候刺伤您……请相信我!

    当出于某些原因from module import *需要时,解决方法是在变量中定义名称空间污染,module变量__all__将应使用star运算符导入的内容列入白名单。

    HTH!



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看