Python在处理功能复用和功能颗粒度划分时采用了类、模块、包的结构。 python
类:类的概念在许多语言中出现,很容易理解。它将数据和操做进行封装,以便未来的复用。类写在模块里。 app
模块:一般是一个python文件,定义了某些函数和变量。你在其余须要这些功能的文件中,导入这模块,就可重用这些函数和变量。通常用module_name.fun_name,和module_name.var_name进行使用。 函数
包:包对应于文件夹,包含许多模块。咱们通常将某些功能相近的模块放在同一个包中。使用包的方式跟模块也相似,惟一须要注意的是,当文件夹看成包使用时,文件夹须要包含__init__.py文件,主要是为了不将文件夹名看成普通的字符串。__init__.py的内容能够为空,通常用来进行包的某些初始化工做或者设置__all__值,__all__是在from package-name import *这语句使用的,所有导出定义过的模块。 this
work:#工做目录 package1 __init__.py module1.py func1() package2 __init__.py module2.py func2() main.py main()#主程序
首先须要找到module2,用以下代码声明mudule2路径(实际上是将mudule2路径加入到sys.path中): spa
#__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" ...注意:此时运行module1会报错,若查看sys.path可看到咱们添加的路径变为..\working\package1\package2\module2,显然,这个路径并非module2的路径,原来错误在这里,那么到底怎么回事呢?记得os.getcwd()吗,它是返回当前运行模块所在目录,而咱们运行mudule1,所以...
# main.py from package1.module1 import func1 def main(): func1() if __name__ == "__main__": main()注意:i) 此时从main.py调用func1,并无事先声明module1的路径
ii) 运行main.py, 你猜,程序可以正确运行么?没错,此时,能够获得正确的输出。 code
#假如 func2 的功能是打印一条 “this is func2” #输出以下: This is func2 This is func1
不须要添加路径,利用__all__,参考博文 字符串
具体操做为,在每一个包的__init__.py文件中用__all__指定要引用的模块。如: get
# package1\__init__.py __all__=["module1"] #package2\__init__.py __all__=["module2"]