zoukankan      html  css  js  c++  java
  • Python的__init__.py用法

    python中包的引入,对于大型项目中都会使用到这个功能,把实现不同功能的python文件放在一起,组成不同lib库,然后在其他地方调用。

    包,python源文件+__init__.py 

    模块,python源文件

    1、__init__.py基本介绍


    首先看下面这个例子

    例子1

    #!/usr/bin/env python2.7
    #-*- coding:utf-8 -*-
    
    from package.src.test import A
    
    a = A(2)
    a.aPrint()
    

      

    从package包中的src子包中test.py文件中,引入A类,如何实现这一点??

    需要构建如下的目录结构:

    [root@typhoeus79 test]# tree
    .
    |-- package
    |   |-- __init__.py
    |   |-- __init__.pyc
    |   `-- src
    |       |-- __init__.py
    |       |-- __init__.pyc
    |       |-- test.py
    |       `-- test.pyc
    `-- test_pack.py
    
    2 directories, 7 files
    

      

    这里面涉及到两个目录,package和src目录,并且每个目录中都有__init__.py文件。

    python的每个模块的包中,都有一个__init__.py文件,有了这个文件,我们才能导入这个目录下的module,是将目录设置为module的标识。

    2、__init__.py其他功能


    其实,__init__.py里面还是可以有内容的,我们在导入一个包时,实际上导入了它的__init__.py文件。
    我们可以再__init__.py文件中再导入其他的包,或者模块。
    [python]
    import readers
    import writers
    import commands
    import users
    import meta
    import auth
    import admin 

    这样,当我们导入这个包的时候,__init__.py文件自动运行。帮我们导入了这么多个模块,我们就不需要将所有的import语句写在一个文件里了,也可以减少代码量。
    不需要一个个去导入module了。
    __init__.py 中还有一个重要的变量,叫做 __all__。我们有时会使出一招“全部导入”,也就是这样:
    from PackageName import *
    这时 import 就会把注册在包 __init__.py 文件中 __all__ 列表中的子模块和子包导入到当前作用域中来。比如:
    #文件 __init__.py

    __all__ = ["Module1", "Module2", "subPackage1", "subPackage2"]

    例子2:

    [root@typhoeus79 test]# tree
    .
    |-- package
    |   |-- __init__.py
    |   |-- __init__.pyc
    |   `-- src
    |       |-- __init__.py
    |       |-- __init__.pyc
    |       |-- test.py
    |       `-- test.pyc
    `-- test_pack.py
    
    2 directories, 7 files
    [root@typhoeus79 test]# more ./package/__init__.py
    import os
    import datetime
    [root@typhoeus79 test]# more test_pack.py 
    #!/usr/bin/env python2.7
    #-*- coding:utf-8 -*-
    
    from package.src.test import A
    from package.__init__ import *
    
    a = A(2)
    a.aPrint()
    
    print datetime.datetime.now()
    [root@typhoeus79 test]# ./test_pack.py 
    2
    2014-07-28 16:35:09.267241
    

      

    3、子目录之间模块引用

    .
    |-- __init__.py
    |-- lib
    |   |-- __init__.py
    |   |-- __init__.pyc
    |   |-- src
    |   |   |-- __init__.py
    |   |   |-- __init__.pyc
    |   |   |-- a.py
    |   |   `-- a.pyc
    |   `-- test.py
    |-- main
    |   |-- __init__.py
    |   `-- b.py
    `-- test.py
    

    main目录中的b.py脚本调用lib->src->a.py中的类AObject

    [root@typhoeus79 ice_test_m test]# more main/b.py 
    #!/usr/bin/env python2.7
    #-*- coding:utf8 -*-
    import sys
    import os
    
    sys.path.append(os.path.dirname(__file__) +os.sep+'../lib')
    
    from src.a import AObject
    
    def main():
        ao = AObject('Helloword')
        ao.printword()
    
    if __name__ == '__main__':
        main()
    

    需要把lib目录的绝对路径添加到path中

    当然也可以这么写

    sys.path.append(os.path.dirname(__file__) +os.sep+'../')
    
    from lib.src.a import AObject
    
    def main():
        ao = AObject('Helloword')
        ao.printword()
    

    会从sys.path中查找

    使用相对路径执行./b.py,sys.path最后一项为./../

    使用绝对路径执行python2.7 /data1/guosong/opdir/20141013/test/main/b.py ,sys.path最后一项为/data1/guosong/opdir/20141013/test/main/../

    然后按照这个路径,进行目录lib->src->a.py查找对应的类

    4、参考文献


    1、http://www.cnblogs.com/BeginMan/p/3183629.html

  • 相关阅读:
    POJ 1330 Nearest Common Ancestors(LCA Tarjan算法)
    LCA 最近公共祖先 (模板)
    线段树,最大值查询位置
    带权并查集
    转负二进制
    UVA 11437 Triangle Fun
    UVA 11488 Hyper Prefix Sets (字典树)
    UVALive 3295 Counting Triangles
    POJ 2752 Seek the Name, Seek the Fame (KMP)
    UVA 11584 Partitioning by Palindromes (字符串区间dp)
  • 原文地址:https://www.cnblogs.com/gsblog/p/3873401.html
Copyright © 2011-2022 走看看