Python 在类内使用导入

Python 在类内使用导入,python,class,import,Python,Class,Import,我对python类的概念是完全陌生的。在寻找解决方案几天后,我希望我能在这里得到帮助: 我想要一个python类,在这里我导入一个函数并在那里使用它。主代码应该能够从类中调用函数。为此,我在同一个文件夹中有两个文件 多亏了@cdarke、@DeepSpace和@MosesKoledoye,我才编辑了这个错误,但遗憾的是,不是这样 我仍然得到错误: 测试0 回溯(最近一次呼叫最后一次): 文件“run.py”,第3行,在 foo.doit() 文件“/Users/ls/Documents/Ent

我对python类的概念是完全陌生的。在寻找解决方案几天后,我希望我能在这里得到帮助:

我想要一个python类,在这里我导入一个函数并在那里使用它。主代码应该能够从类中调用函数。为此,我在同一个文件夹中有两个文件


多亏了@cdarke、@DeepSpace和@MosesKoledoye,我才编辑了这个错误,但遗憾的是,不是这样

我仍然得到错误:

测试0
回溯(最近一次呼叫最后一次):
文件“run.py”,第3行,在
foo.doit()
文件“/Users/ls/Documents/Entwicklung/RaspberryPi/test/test.py”,第8行,在doit中
自动定时器(5)
文件“/Users/ls/Documents/Entwicklung/RaspberryPi/test/test.py”,第6行,在计时器中
zeit.睡眠(2)
NameError:未定义全局名称“zeit”


@wombatz得到了正确的提示: 它必须是self.zeit.sleep(2)或Test.zeit.sleep(2)。导入也可以在类声明之上完成


Test.Py

class Test:
    import time as zeit
    def timer(self, count):
        for i in range(count):
            print("test "+str(i))
            self.zeit.sleep(2)      <-- self is importent, otherwise, move the import above the class declaration
    def doit(self):
        self.timer(5)
from test import Test
foo = Test()
foo.doit()
当我尝试
python run.py
时,出现以下错误:

测试0
回溯(最近一次呼叫最后一次):
文件“run.py”,第3行,在
foo.doit()
文件“/Users/ls/Documents/Entwicklung/RaspberryPi/test/test.py”,第8行,在doit中
自动定时器(5)
文件“/Users/ls/Documents/Entwicklung/RaspberryPi/test/test.py”,第6行,在计时器中
睡眠(2)
NameError:未定义全局名称“睡眠”

我从错误中了解到,类中的导入无法识别。但是如何才能确保类中的导入被识别?

sleep
不是python内置的,并且名称本身不引用任何对象。因此,Python正确地提出了一个
名称or

你打算:

import time as zeit

zeit.sleep(2)
并将
导入时间作为zeit
移动到模块顶部


别名为
zeit
time
模块可能不会出现在模块的全局符号表中,因为它是在
类中导入的

您就快到了<代码>睡眠是
时间
模块内的一项功能。这意味着除非在
时间
的上下文中理解它,否则名称
sleep
不存在,除非您自己定义它。因为您没有自己定义它,所以可以通过运行
time.sleep(2)
来访问它

在您的具体示例中,您使用了:

import time as zeit
您必须运行:

zeit.sleep(2) 
或者,您可以通过运行以下命令直接从时间导入睡眠:

from time import sleep
sleep(2)
祝你好运

您可以在此处阅读有关时间模块的更多信息:

您可以在此处了解有关导入的更多信息:

我强烈建议您学习python中的名称空间,请点击这里:

。你也可以使用

from time import sleep

编辑:已解释导入类范围内的问题。

必须从该类访问在类命名空间内定义的所有内容。这适用于方法、变量、嵌套类和包括模块在内的所有其他内容

如果确实要在类内导入模块,则必须从该类访问该模块:

class Test:
    import time as zeit
    def timer(self):
        self.zeit.sleep(2)
        # or Test.zeit.sleep(2)
但是为什么要在类中导入模块呢?我想不出一个这样的用例,尽管我想把它放到那个名称空间中

您确实应该将导入移到模块的顶部。然后您可以在类内调用
zeit.sleep(2)
,而无需前缀
self
Test


此外,您不应使用非英语标识符,如
zeit
。只会说英语的人应该能够阅读您的代码。

我同意@Wombatz的解决方案,但我没有足够的声誉来评论他的问题

我发现在类中导入模块的一个用例是当我想从配置文件初始化一个类时

假设我的配置文件是

config.py

class Test:
    import time as zeit
    def timer(self, count):
        for i in range(count):
            print("test "+str(i))
            self.zeit.sleep(2)      <-- self is importent, otherwise, move the import above the class declaration
    def doit(self):
        self.timer(5)
from test import Test
foo = Test()
foo.doit()
在我的主要模块中

做点什么。py

class Test:
    import time as zeit
    def timer(self, count):
        for i in range(count):
            print("test "+str(i))
            self.zeit.sleep(2)      <-- self is importent, otherwise, move the import above the class declaration
    def doit(self):
        self.timer(5)
from test import Test
foo = Test()
foo.doit()
现在,这个方案的优点是,如果不需要,我们不需要在全局名称空间中导入日志文件


然而,在do_something.py的开始导入时,我必须在类中使用globals,这在我看来有点难看。

可能有点晚了,但我同意不污染模块级名称空间的想法(当然,这可能可以通过更好的模块设计来弥补,再加上“显式优于隐式”)

下面是我要做的。基本思想是:
import
是一种隐式赋值,在这种赋值中,整个模块对象被分配给一个名称。因此:

class Test:
    import time as zeit
    
    self.zeit = zeit # This line binds the module object to an attribute of an instance created from the class
    
    def timer(self, count):
        for i in range(count):
            print("test "+str(i))
            self.zeit.sleep(2) # This necessitates the `zeit` attribute within the instance created from the class
    
    def doit(self):
        self.timer(5)

你的意思可能是
zeit.sleep(2)
@cdarke实际上
zeit.sleep
,因为OP使用
作为
@DeepSpace:我的编辑忽略了你的评论。谢谢,我纠正了错误,但我没有帮助-请看我的编辑
sleep(2)
python run.py
的第二次回溯中显示的
与您在
test.py
中所说的内容不匹配,后者具有
zeit.sleep(2)
在那一行。谢谢,我纠正了错误,但我没有帮助-请参阅我的编辑。@ludwigschuster查看我的更新:将
导入时间作为zeit
移到模块顶部。谢谢,我纠正了错误,但我没有帮助-请参阅我的编辑。将导入语句移到类定义上方。
导入时间作为zeit
应该是超出
类测试:
行。@ludwigschuster,你能试试这个吗?谢谢,我纠正了错误,但我没有帮助-请看我的编辑。@ludwigschuster你应该阅读链接在这里的答案。没有理由在你的类中进行导入。它应该放在模块的顶部。(注意-对于需要在导入之前进行特殊初始化的模块,也有例外情况,但这种情况很少见,
time
module)@syntonym对不起,我不太明白。你能给我举个例子吗?对不起,我想我误解了你。我想