【问题标题】: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)
结果:main.Test at 0x5029>