在类中导入模块,但是在类方法中使用模块时出现NameError

时间:2020-02-15 07:08:53

标签: python-3.x python-import

在我的python脚本中,我试图在类中导入模块,并在class方法中使用导入的模块。

class test:
    import urllib.parse

    def __init__(self, url):
        urlComponents = urllib.parse.urlsplit(url)

但是,当我尝试使用测试类时,例如

test("http://test.com")

我得到了错误:

NameError:名称'urllib'未定义

为什么类主体中的import语句不生效?

我在Windows 10中使用python 3.8.1。

3 个答案:

答案 0 :(得分:1)

您失踪是self.urllib.parse。

如果您确实要在类中导入模块,则必须从该类中访问它:

spl

结果:<< strong>主要。在0x5029处测试>

答案 1 :(得分:1)

import语句执行名称绑定,但是类范围内的名称在方法内部不直接可见。这与任何其他类名相同。

>>> class Test:
...     a = 2   # bind name on class
...     def get_a(self):
...         return a  # unqualified reference to class attribute
...
>>> Test().get_a()
NameError: name 'a' is not defined

您可以通过类或实例来引用任何类属性。这也适用于导入的名称。

class test:
    import urllib.parse

    def __init__(self, url):
        #               V refer to attribute in class
        urlComponents = self.urllib.parse.urlsplit(url)

请注意,将模块绑定到类中没有任何好处,除了将名称隐藏在全局范围之外。通常,您应该在全局范围内导入。

import urllib.parse

class test:

    def __init__(self, url):
        #               V refer to global module
        urlComponents = urllib.parse.urlsplit(url)

答案 2 :(得分:-1)

引用Const a

导入始终放在文件顶部,紧随任何模块之后 注释和文档字符串,以及模块全局变量和常量之前。

我认为将导入文件放在文件顶部是个好习惯。