对导入及其使用方法的困惑

Confusion on import and how to use it

我是 python 的新手,我对导入方法有些困惑。

我认为如果我这样做:

from tkinter import *

我应该可以使用:

filedialog.askopenfilename

但是,它给出了一个错误,指出未解决的引用。

如果我这样做:

from tkinter import filedialog
filedialog.askopenfilename

它工作正常,我明白为什么会这样。但是,我不明白为什么 Python 不让我用 from tkinter import *

filedialog.askopenfilename

阅读 this and this 以更深入地了解 from <foo> import * 的工作原理。

有两种不同的 from 目标:模块和包。

  • 一个模块是一个单一的python文件。如果您 import * 来自模块,它会导入所有内容,除了以“_”开头的私有名称。
  • A package 是文件夹,如 tkinter。如果您 import * 来自一个包,它会导入其 __init__.py 中存在的所有名称。如果 __init__.py 不存在,则不导入任何内容。

在这两种情况下,import * 的行为都可以通过定义 __all__ 来覆盖。

tkinter 是一个文件夹(=包)并且在其 __init__.py 中未定义 __all__,因此 from tkinter import * 仅在其 __init__.py 中导入名称,例如 TkButtonLabel,但不是 filedialog