我正在通过优秀的"Python The Hard Way"工作,并将以下代码复制到名为mystuff.py的文件中:
class MyStuff(object):
def __init__(self):
self.tangerine = "And now a thousand years between"
def apple(self):
print "I AM CLASSY APPLES!"
Run Code Online (Sandbox Code Playgroud)
在终端:
import mystuff
thing = MyStuff()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'MyStuff' is not defined
Run Code Online (Sandbox Code Playgroud)
今天,其他简单的课程一再发生这种情况.有人能告诉我我做错了什么吗?
您可能想要thing = mystuff.MyStuff()
(假设mystuff
是该类MyStuff
所在文件的名称).
这里的问题是python如何处理命名空间.您通过导入将某些内容添加到当前命名空间中,但是将命名空间从一个文件合并到另一个文件的方式有很大的灵活性.例如,
import mystuff
Run Code Online (Sandbox Code Playgroud)
将mystuff(模块/文件级别)命名空间中的所有内容添加到当前命名空间中,但是要访问它,您需要mystuff.function_or_class_or_data
.如果您不想一直输入mystuff
,可以在当前模块(文件)中更改用于引用它的名称:
import mystuff as ms
Run Code Online (Sandbox Code Playgroud)
现在,你可以MyStuff
通过:
thing = ms.MyStuff()
Run Code Online (Sandbox Code Playgroud)
而且(差不多)最后,还有from mystuff import MyStuff
.在这种形式中,您可以MyStuff
直接进入命名空间,但其他任何内容都不会mystuff
进入您的命名空间.
最后,(不推荐这个)from mystuff import *
.这与前一个相同,但它也抓取mystuff
文件中的所有其他内容并导入它.
您将模块导入到本地命名空间,但不是类.如果要将该类与当前导入一起使用,则需要:
thing = mystuff.MyStuff()
Run Code Online (Sandbox Code Playgroud)
如果您想使用您拥有的声明,您需要:
from mystuff import MyStuff
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
115 次 |
最近记录: |