一、模块的概念
1.1 好处:
提高了代码的可维护性,其次,编写代码不必从0开始,当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括python内置的模块和来自第三方的模块。
1.2 模块有3种:
python标准库:(而标准库,指的是你安装Python程序(解释器)后,在安装目录里存在模块),参考:http://www.liujiangblog.com/course/python/51
第三方模块:(Python内置的标准库之外的所有模块都称为第三方模块)
应用程序自定义模块:(.py文件就是一个模块)
1.3 模块调用函数的方法
bin.py
#第1种方法
# import sys
# import calculate #解释器通过搜索路径找到calculate.py后,将calculate=calculate.py all ccode
#
# print(calculate.add(1, 2))
# print(calculate.sub(2, 1))
#
# #print(a) #name 'a' is not defined
# print(calculate.a) #3
#
# print(sys.path) #搜索路径
##第2种方法
# import calculate, sys
# print(calculate.add(1, 2))
# print(calculate.sub(2, 1))
#
# #print(a) #name 'a' is not defined
# print(calculate.a) #3
#
# print(sys.path) #搜索路径
##第3种方法
# from calculate import add, sub##只需要从模块种调用某几个函数,不需要编译完
# print(add(1, 4))
# print(sub(3, 6))
##第4种方法把所有的函数都搞过来,尽量不用
# from calculate import *
# print(add(1, 2))
# print(a)
##第5种方法 改名字
#from calculate import add as plus
calculate.py
print('ok')
a = 3
def add(x, y):
return x+y
def sub(x, y):
return x-y
bin.py和calculate.py 在同一个包下面
二、包(package)
paython新建种,有directory(目录,文件夹),paython package(里面有init.py文件)。
模块是用来组织函数的,包是用来组织模块的。
##包调用模块的方法
# from web import logger
# logger.logger()
#如果多加一层
# from web.web2 import logger
# logger.logger()
##如果直接调用函数
# from web.web2.logger import logger
# logger()
三、__file__
bin.py
from module import main
main.main()
logger.py
def logging():
print('logging')
main.py
import logger
def manin():
logger.logging()
对bin.py进行运行,结果错误。把main.py改为
from moudle import logger
def main():
logger.logging()
对bin.py进行运行,结果为logging,但是有隐藏错误。python自己做了一件事情,把bain.py改为
from module import main
main.main()
import sys
print(sys.path)
运行结果多了一个地址, 'C:\\Users\\asus\\PycharmProjects\\ATM',python自己加上的,才能保证程序的正确运行。
验证:找到bin文件地址,复制到终端(cmd)
在cmd执行 是错误的
解决问题:添加绝对路径
import sys
sys.path.append('C:\\Users\\asus\\PycharmProjects\\ATM')
from module import main
main.main()
在pychrm cmd执行成功
但是这种方法有局限性,传到别的计算机,就不能执行了。因此把绝对路径改为相对路径。
import sys
sys.path.append('C:\\Users\\asus\\PycharmProjects\\ATM')
from module import main
main.main()
print(__file__)
在pychrm cmd执行,输出结果为:C:/Users/asus/PycharmProjects/ATM/bin/bin.py
把bin.py改为
import sys
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
# sys.path.append('C:\\Users\\asus\\PycharmProjects\\ATM')
from module import main
main.main()
print(__file__)
#print(os.path.abspath(__file__))
#print(os.path.dirname(os.path.abspath(__file__)))
#print(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# sys.path.append(BASE_DIR)
这样在cmd pycharm 运行结果都是一样为logging,且可以在其他计算机上运行
四 、__name__
bin.py
import foo
foo.hello() ##hello
foo.py
def hello():
print('hello')
#hello()
#print(__name__)
if __name__=='__main__':
hello()
bin.py和foo.py 在同一个包下面
五、软件目录结构规范
5.1、"设计项目目录结构"的原因:
(1)可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等。从而非常快速的了解这个项目。
(2)可维护性高: 定义好组织规则后,维护者就能很明确地知道,新增的哪个文件和代码应该放在什么目录之下。这个好处是,随着时间的推移,代码/配置的规模增加,项目结构不会混乱,仍然能够组织良好。
5.2、举例
5.3、应用