【问题标题】:import module in Class, but NameError when using module in class method在类中导入模块,但在类方法中使用模块时出现名称错误
【发布时间】:2020-02-15 07:08:53
【问题描述】:

在我的 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。

【问题讨论】:

    标签: python-3.x python-import


    【解决方案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】:

    您缺少的是 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)
    

    结果:ma​​in.Test at 0x5029>

    【讨论】:

      猜你喜欢
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多