使用点表示法导入

13

有人能向我解释一下吗? 当你导入 Tkinter.Messagebox 时,这实际上是什么意思(点符号表示法)? 我知道你可以导入 Tkinter,但当你导入 Tkinter.Messagebox 时,这到底是什么?它是一个类内嵌在另一个类中吗?

我刚学Python,点符号表示法有时会让我感到困惑。


这是一个模块内的类。这意味着只有Messagebox类可用,而导入Tkinter将导入所有类。我建议在Python IDLE中尝试并进行调试。 - Chen A.
如果您阅读文档,我希望您能在那里找到一个好的解释,而不是在这里在SO上。 - Arpit Solanki
1
@Vinny:它不是模块内的类,而是包内的模块。 - Mark Dickinson
1
请检查大小写,没有任何Tkinter.Messagebox - Antti Haapala -- Слава Україні
2个回答

8

import a.bb 导入到命名空间 a 中,你可以通过 a.b 访问它。请注意,这仅适用于 b 是模块的情况。(例如在 Python 3 中使用 import urllib.request

然而,from a import bb 导入到当前命名空间中,并可通过 b 访问。这对于类、函数等都有效。

使用 from - import 时要小心:

from math import sqrt
from cmath import sqrt

这两个语句都将函数sqrt引入当前命名空间中,但是第二个导入语句会覆盖第一个。


"import a.bb 导入到命名空间 a 中。" 这很有帮助。我以为在导入 a 时,所有 a 的“子模块”都会自动导入,但在 Python 中似乎并非如此 - 您需要明确导入子模块。但只有有时候?这与它是属性还是新模块/文件有关吗? - joe

8

当你在导入时加上那个点号,就是引用你要导入的包或文件中的某些东西。 你所导入的可以是一个类、一个包或一个文件,每次加上一个点号就是询问前面实例中的某些东西。

parent/
    __init__.py
    file.py
    one/
        __init__.py
        anotherfile.py
    two/
        __init__.py
    three/
        __init__.py

例如,当您传递 import parent.file 时,实际上是在导入另一个可能包含类和变量的 Python 模块,因此要引用该文件中的特定变量或类,可以使用 from parent.file import class
这可能会进一步扩展,例如在包内导入另一个包或文件内的类等(如 import parent.one.anotherfile)。 有关更多信息,请阅读有关此内容的Python文档

“import parent.file.class” 没有意义:这种形式的导入语句只能导入模块和包。(例如尝试 import decimal.Decimal,它不起作用。) - Mark Dickinson
@MarkDickinson 我已经编辑过了,现在可以工作了吗?我尝试不包括 from .. import ..,因为他是初学者。 - Mike
@GeekyMo,我明白你告诉我的内容,但是当我导入Tkinter时,我也会得到一些可用的函数。在你的例子中,如果我导入parent,我将什么都得不到。 我的意思是,parent只是一个文件夹,对吧?里面什么都没有。 那么Tkinter是一个包还是一个模块? - Kwnstantinos Nikoloutsos
@KwnstantinosNikoloutsos 如果你导入一个包(父级),实际上你导入的是它的__init__文件,该文件表示该文件夹是一个Python包。因此,如果你导入Tkinter,它将导入Tkinter包文件夹中的__init__文件,该文件可能包含函数,也可能不包含函数。当你从中导入某些东西,例如from Tkinter import func,它会首先搜索__init__,然后查找该包中的模块。 - Mike
Tkinter是一个文件夹,其中包含一个__init__.py文件,告诉Python它是一个包,并且关于它的类型,这取决于你如何导入。如果你导入Tkinter,实际上是导入了它内部的__init__模块;如果你使用from Tkinter import module或者import Tkinter.module(在某些情况下),则将Tkinter视为Python模块的包。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接