2

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

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。

4

2 回答 2

1

您缺少的是 self.urllib.parse 。

如果你真的想在一个类中导入一个模块,你必须从那个类访问它:

class Test:
    import urllib.parse as ul


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

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

结果:< main .Test at 0x5029>

于 2020-02-15T08:53:16.280 回答
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)
于 2020-02-15T09:12:02.333 回答