python 



 python 类,模块,包

Python在处理功能复用和功能颗粒度划分时采用了类、模块、包的结构。

类:类的概念在许多语言中出现,很容易理解。它将数据和操作进行封装,以便将来的复用。类写在模块里。

模块:通常是一个python文件,定义了某些函数和变量。你在其他需要这些功能的文件中,导入这模块,就可重用这些函数和变量。一般用module_name.fun_name,和module_name.var_name进行使用。

包:包对应于文件夹,包含许多模块。我们一般将某些功能相近的模块放在同一个包中。使用包的方式跟模块也类似,唯一需要注意的是,当文件夹当作包使用时,文件夹需要包含__init__.py文件,主要是为了避免将文件夹名当作普通的字符串。__init__.py的内容可以为空,一般用来进行包的某些初始化工作或者设置__all__值,__all__是在from package-name import *这语句使用的,全部导出定义过的模块。



不同包间类,函数,变量的引用



目录如下:
work:#工作目录
    package1
        __init__.py
        module1.py
            func1()
    package2
        __init__.py
        module2.py
            func2()
    main.py
        main()#主程序
work:#工作目录
    package1
        __init__.py
        module1.py
            func1()
    package2
        __init__.py
        module2.py
            func2()
    main.py
        main()#主程序



(1) 在module1中调用module2中的func2

     首先需要找到module2,用如下代码声明mudule2路径(其实是将mudule2路径加入到sys.path中):

#__init__.py

import os
import sys
sys.path.append(os.getcwd()+"\\package2\\module2")
#__init__.py

import os
import sys
sys.path.append(os.getcwd()+"\\package2\\module2")

    此时,可以在module1中调用func2:


#module.py

from package2.module2 import func2

def func1():
    func2()
    print "This is func1"
    ...
#module.py

from package2.module2 import func2

def func1():
    func2()
    print "This is func1"
    ...

注意:此时运行module1会报错,若查看sys.path可看到我们添加的路径变为..\working\package1\package2\module2,显然,这个路径并不是module2的路径,原来错误在这里,那么到底怎么回事呢?记得os.getcwd()吗,它是返回当前运行模块所在目录,而我们运行mudule1,因此...


(2) 在main.py中调用func1:
# main.py
from package1.module1 import func1

def main():
    func1()

if __name__ == "__main__":
    main()
# main.py
from package1.module1 import func1

def main():
    func1()

if __name__ == "__main__":
    main()

注意:i) 此时从main.py调用func1,并没有事先声明module1的路径


        ii) 运行main.py, 你猜,程序能够正确运行么?没错,此时,可以得到正确的输出。

#假如 func2 的功能是打印一条 “this is func2”

#输出如下:

This is func2
This is func1
#假如 func2 的功能是打印一条 “this is func2”

#输出如下:

This is func2
This is func1



方法(2)

不需要添加路径,利用__all__,参考博文

具体操作为,在每个包的__init__.py文件中用__all__指定要引用的模块。如:

# package1\__init__.py
__all__=["module1"]

#package2\__init__.py
__all__=["module2"]
# package1\__init__.py
__all__=["module1"]

#package2\__init__.py
__all__=["module2"]