初识 Python 对包和模块引入的疑惑

2015-12-29 15:43:41 +08:00
 SimpKae

from tkinter import *
import tkinter.messagebox as messagebox

以上代码中 tkinter 是一个包,然后第一句把包里面的所有模块引入进来。

第二句 messagebox 是 tkinter 中的一个模块,按我的理解,第一句已经全部引入进来了,为什么还要把 messagebox 单独引入才能正常使用了。而不写第二句,我尝试用 tkinter.messagebox.func(),或者 messagebox.func()调用都报错 not define 。

麻烦 pythoner 们授业解惑,小弟不甚感激

2889 次点击
所在节点    Python
7 条回复
yangtukun1412
2015-12-29 15:48:49 +08:00
from tkinter import * 引入的是 tkinter/__init__.py 中的内容,而在 __init__.py 中没有 import messagebox ,所以没有引入。
nooper
2015-12-29 15:49:35 +08:00
不要用 import *
要了解 packages 结构。
分绝对导入,相对导入,还有神吗导入。
你可以理解一下 locals () 和 globals ()
比如你导入的时候可以写成
from .packages import mydev
或者 from apps.packages import mydev
等等,避免循环调用会非常的影响性能,
千万不要再函数里方法里面写 import ,如果这么写代码就可以说写得很垃圾了,一开始就没有设计好。
SimpKae
2015-12-29 15:53:37 +08:00
@yangtukun1412 非常感謝,小弟顿时茅舍顿开呀,看來得学的更细致些。
SimpKae
2015-12-29 15:55:28 +08:00
@nooper 謝謝您的指點,學習了。
garfieldWu
2015-12-29 16:53:17 +08:00
补充 nooper ,不同导入路径的同一个包所占的内存空间也是不同的,就是由于 locals()和 globals()
qnnnnez
2015-12-31 17:50:19 +08:00
@nooper 当循环 import 不可避免的时候, import 就应该写在函数里。
nooper
2015-12-31 18:47:06 +08:00
@qnnnnez 我就从来没有这么写过,这样写的绝大多数是设计缺陷。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/246938

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX