2017-04-21 79 views
-2

我用认为两者相等,直到我试图这样的:Python:“import X”和“from X import *”有什么区别?

$python 
Python 2.7.13 (default, Dec 17 2016, 23:03:43) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import Tkinter 
>>> root=Tk() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'Tk' is not defined 
>>> from Tkinter import * 
>>> root=Tk() 

那么什么是这2种进口的,从一个模块中导入所有的核心区别?

谢谢。

+2

虽然“明星”导入经常用在Tkinter示例代码中,但这并不是一种好的做法。它将所有这些Tkinter名称转储到您的名称空间(Python 2中的175个名称,Python 3中的135个名称)。这会造成不必要的混乱,以及名称冲突的可能性,尤其是如果您导入另一个模块。它还使代码更难阅读,因为您必须记住哪些名称是Tkinter名称,而不是能够明确地看到它。首选的做法是'将Tkinter导入为tk',然后执行'root = tk.Tk();按钮= tk.Button(root,...)'。 –

+0

请注意,所有形式的'import' _always_导入(并执行)整个模块,不同之处在于它们在导入模块中提供哪些名称。 –

回答

1

当您导入X,它结合了名称x到x对象,它不会给你那是你的模块,如果你想访问你需要指定这样的

任何对象的任何对象直接访问
x.myfunction() 

在当你输入从X导入*使用的另一面,它把所有的功能集成到你的模块,这样反而x.myfunction()例如,您可以直接访问它

myfunction()

让我们假设我们有模块example.py

def myfunction(): 
    print "foo" 

现在我们的主要脚本main.py,它利用这个模块。

如果你使用简单的导入,那么你需要的,如果你用它来调用MyFunction的()这样的

import example 

example.myfucntion() 

,你不需要使用模块名称来指代功能,可以直接调用这样

from example import myfunction 

myfunction() 
+1

你让它听起来像在普通的用户脚本中使用星形导入是一件好事。不是这样_。星型导入可以方便地在交互式shell中进行快速实验,但是它们不应该用于普通脚本。明星导入有一个合理的用途:它有助于统一包中多个模块的名称,以使它们的行为好像它们都在一个模块中定义,但用户代码很少这样做是一个好主意,那就是包作家的工作。 –

+0

正如[如何回答](http://stackoverflow.com/questions/how-to-answer)中所述,请避免回答不清楚,广泛的SW记录,错字,基于意见的,不可重复的或重复的问题。回答不适当的问题会使网站变得更难以浏览和鼓励更多这样的问题,从而损害其他用户的志愿者时间和专业知识。 –

相关问题