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"]