Python2.7 模块和包管理学习小结 04

2017-01-24  本文已影响20人  JMasche

根据例子逐个分析

导入下一层目录中的文件

  1. 见上篇
  2. 见上篇
  3. 见上篇
  4. 见上篇
  5. 见上篇
  6. 通过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__.pyimport third1,代码如下:

# 导入third1
import third1
# __init__.py原始代码
print "============== third.__init__ =============="
print dir()

其次,在effects目录的__init__.pyimport 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()来调用函数。

上一篇下一篇

猜你喜欢

热点阅读