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)
原文地址:https://www.cnblogs.com/knighterrant/p/9988642.html