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

import module in Class, but NameError when using module in class method

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

class test:
    import urllib.parse

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

然而,当我尝试使用 class 测试时,例如

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

我收到错误:

NameError: name 'urllib' is not defined

为什么class body中的import语句不生效?

我在windows10中使用python3.8.1。

self.urllib.parse 你不见了。

如果您真的想在 class 中导入模块,您必须从 class:

访问它
class Test:
    import urllib.parse as ul


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

t1 = Test("www.test.com")  
print(t1)

结果:<main。在 0x5029 测试>

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

>>> 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 或实例来引用任何 class 属性。这也适用于导入的名称。

class test:
    import urllib.parse

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

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

import urllib.parse

class test:

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