2017-06-06 98 views
0

我只是4天到Python。我只是想了解根__init__.py导入功能。谷歌搜索了解相同,但无法找到一个有用的链接(可能是我的搜索关键是不相关的)。请分享一些链接。Python导入类错误,试图了解根目录__init__.py

我收到错误的 “导入错误:无法导入名字的人”

下面是结构

Example(directory) 
    model 
     __init__.py (empty) 
     myclass.py 
    __init__.py 
    run.py 

myclass.py

class Person(object): 
    def __init__(self): 
     self.name = "Raja" 

    def print_name(self): 
     print self.name 

__init__.py

from model.myclass import Person 

ru n.py

from model import Person 

def donext(): 
    person = Person() 
    person.print_name() 

if __name__ == '__main__': 
    donext() 
+0

'Person'不在'model'中 - 它在'model.myclass'中。您正在'__init __。py'中正确执行导入。你为什么在'run.py'中做不同的事情? –

+0

你为什么加了'flask'标签? – gonczor

+0

@ john-gordon in run.py,我只是试图从\ __ init__.py导入并使用相同的 –

回答

1

无论是作为@gonczor建议,你可以只需将__init__留空即可(此外,您不需要root用户)并直接从包中导入:

from model.myclass import Person 

或者,如果您有意扁平封装的接口,这是如此简单:

模型/ __ init__.py

from myclass import Person 

run.py

from model import Person 
+0

谢谢,现在理解,将继续学习 –

1

误差基本上是说解释无法找到任何会在一个给定的命名空间匹配Person,你的情况model包。这是因为它在model.myclass包中,但它被导入到root而不是run

python中的模块基本上是__init__.py脚本的目录。但从init的根级别导入任何东西都很棘手。而且,这不是必需的。

好吧,这意味着解决方案是直接从model包或从rott级__init__.py导入。我会推荐以前的方法,因为它更常用。你可以这样做:

from model.myclass import Person 

def donext(): 
    person = Person() 
    person.print_name() 

if __name__ == '__main__': 
    donext() 

并请假__init__.py为空。它们仅用于初始化,因此不需要将所有内容都导入到它们中。

你可以把一些你model/__init__.py然后导入它myclass.py,如:

__init__.py

something = 0 

myclass.py

from . import something 
print something 
+0

感谢您的回复,学会在子目录级定义\ __init__.py声明和访问您的代码 –

+0

很高兴我可以帮助:) – gonczor

相关问题