根据例子逐个分析
导入下一层目录中的文件
- 见上篇
- 见上篇
- 见上篇
- 见上篇
- 见上篇
-
通过init.py来载入模块。
根据4、5两个例子的运行结果,我们可以观察到只要载入某个目录,必然会先载入其目录下的__init__.py
并且运行。
所以我们尝试可以在每层目录的__init__.py
配置需要的导入,这样可能会在顶层导入时变得简单。
6.1 在effects
的__init__.py
载入echo
,代码如下:
effects.init.py:
# 导入echo
import echo
# __init__.py原始代码
print "============== effects.__init__ =============="
print dir()
test_main.py:
# 导入echo
import effects
effects.echo.test()
# test_mian.py原始内容
print "============== test_main.py =============="
print dir()
def test():
print "============== test_main.test =============="
# main()
if __name__ == '__main__':
test()
运行结果:
============== echo.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__']
============== effects.__init__ ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'echo']
============== echo.test ==============
============== test_main.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'effects']
============== test_main.test ==============
[Finished in 0.3s]
6.2 我们尝试在`test_main.py`中调用第三层目录`third`的`third1.py`中的函数。
首先,在third
目录的__init__.py
中import third1
,代码如下:
# 导入third1
import third1
# __init__.py原始代码
print "============== third.__init__ =============="
print dir()
其次,在effects
目录的__init__.py
中import third
,代码如下:
# 导入echo
import echo
# 导入third
import third
# __init__.py原始代码
print "============== effects.__init__ =============="
print dir()
最后,我们可以直接import effects
之后,通过effects.third.third1.test()
在test_main.py
中完成调用:
# 导入
import effects
effects.third.third1.test()
# test_mian.py原始内容
print "============== test_main.py =============="
print dir()
def test():
print "============== test_main.test =============="
# main()
if __name__ == '__main__':
test()
运行结果:
============== echo.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__']
============== third1.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__']
============== third.__init__ ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'third1']
============== effects.__init__ ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'echo', 'third']
============== chird1.test ==============
============== test_main.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'effects']
============== test_main.test ==============
[Finished in 0.2s]
6.3 **如果我们在`_init__.py`中用`from m import f`的方式载入到函数,调用时会如何?**
effects.init.py:
# 导入
from echo import *
# __init__.py原始代码
print "============== effects.__init__ =============="
print dir()
test_main.py: 我们先只导入effects,并不尝试调用
# 导入
import effects
# test_mian.py原始内容
print "============== test_main.py =============="
print dir()
def test():
print "============== test_main.test =============="
# main()
if __name__ == '__main__':
test()
运行结果:
============== echo.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__']
============== effects.__init__ ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'echo', 'test', 'test1']
============== test_main.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'effects']
============== test_main.test ==============
[Finished in 0.2s]
我们发现,test_main.py
仅仅含有effects
,而effects.__init__
包含有echo
, test
, test1
。
所以,我们可以通过两种调用方式达到目的:effects.echo.test()
和effects.test()
。运行结果如下:
============== echo.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__']
============== effects.__init__ ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'echo', 'test', 'test1']
============== echo.test ==============
============== test_main.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'effects']
============== test_main.test ==============
[Finished in 0.2s]
注意:effects.test()
这种方式,需要注意在effects.__init__
的名字冲突问题
“导入下一层目录中的文件”小结:
1、可以通过import x1.x2.y1
方式导入,这样调用函数的方法是x1.x2.y1.z1()
。
2、可以通过from x1.x2 import y1
方式导入,这样调用函数的方法是y1.z1()
。
3、可以通过配置每一层目录的__init__.py
,然后在上一层目录文件中调用相关函数。
例如:x2
目录的__init__.py
写上import y1
;就可以在x1
目录的模块中import x2
,然后'x2.y1.z1()'来调用函数。
同样:x2
目录的__init__.py
写上from y1 import z1
;就可以在x1
目录的模块中import x2
,然后'x2.y1.z1()'或者x2.z1()
来调用函数。
网友评论