24-25模块和包
模块和包
1. 认识模块
模块可以认为是一个py文件. 模块实际上是我们的py文件运行后的名称空间
导入模块:
1. 判断sys.modules中是否已经导入过该模块
2. 开辟一个内存
3. 在这个内存中执行该py文件
4. 给这个内存起个名字, 一般用的是py文件的名字。返回给导入方
如果你的py文件是启动文件, 名字是__main__
程序的入口一般是:
if __name__ == "__main__":
pass
2. import
import 模块名
模块名.属性/方法/类
每个模块都有自己的独立的名称空间,每个都有一个global, 互相并不影响
模块.属性 = 值. # 不要这么干
3. from xxx import xxx
from 模块 import 函数/变量
当作自己的变量或者函数来使用
from xxx import * 导入所有 在模块中用 __all__=[限定*可用的变量和方法]
导入的内容都可以起别名 as
二.包
1. 包
包就是一个文件夹. py2中包内必须要有一个__init__.py文件, 在python3中可以省略,但是最好都保留.
__init__.py 当我们导入一个包的时候,默认执行这个包内的__init__.py
python中程序单位
一条语句 > 语句块 > 代码块(函数,类) > py文件(模块) > 包
2. 相对导入和绝对导入
相对导入: 相对于当前模块所在的包. 使用的时候必须在包外面启动
绝对导入: 根据包的根目录去导入内容
全部都依赖于 sys.path
3. 使用包要注意的东西
尽量在包的外面启动程序.
三.构建glance包程序
import os os.makedirs('glance/api') os.makedirs('glance/cmd') os.makedirs('glance/db') l = [] l.append(open('glance/__init__.py','w')) l.append(open('glance/api/__init__.py','w')) l.append(open('glance/api/policy.py','w')) l.append(open('glance/api/versions.py','w')) l.append(open('glance/cmd/__init__.py','w')) l.append(open('glance/cmd/manage.py','w')) l.append(open('glance/db/__init__.py','w')) l.append(open('glance/db/models.py','w')) map(lambda f:f.close() ,l)
1.policy.py文件中:
#policy.py # from glance.cmd import manage #绝对路径 def get(): manage.main() print('from policy.py') # get() 会报错, 因为此处的sys.path 为api 不能在sys.path 中找到glance #相对路径 ..上层文件夹 . 当前文件夹 #相对路径只能在包外启动 # from . import versions #让glance同级目录下的test2 访问policy当前文件时,执行versions中的create_resource 方法 # versions.create_resource("你好啊") # from ..cmd import manage # #让glance 同级目录下的test2 访问policy当前文件时,执行cmd 下的manage中的main方法 # manage.main()
2.versions.py文件中
#versions.py def create_resource(conf): print('from version.py: ',conf)
3.manage.py
#manage.py def main(): print('from manage.py')
4.models.py
#models.py def register_models(engine): print('from models.py: ',engine)
有疑问可以加wx:18179641802,进行探讨