python, twenty-three day

模块

import加载模块四个通用类别
1.使用python编写的代码(py.文件)
2.已被编译为共享库或DLL的C或C++扩展
3.包好一组模块的包
4.使用C编写并链接到python解释器的内置函数
在import模块的时候发生的事情
1.寻找模块
2.如果找到了,就开辟一个空间
3.把这个模块中用到的名字都收录到新开辟的空间中
4.创建一个变量来引用这个模块的空间
关于模块
1.模块不会被重复导入
2.模块与文件之间的内存空间始终是隔离的
3.模块的名字必须是符合变量命名规范的
首次导入模块 my_module时做的三件事
1.为源文件(my_module模块)创建新的名称空间,在my_module中定义的函数和方法若是使用到了global时访问的就是这个名称空间
2.在新创建的命名空间中执行模块中包含的代码,见初始导入import my_module
3.创建名字my_module 来引用该命名空间
db_type=input('>>: ')
if db_type == 'mysql':
    import mysql as db
elif db_type == 'oracle':
    import oracle as db
db.方法
View Code

把模块当作脚本执行

我们可以通过模块的全局变量__name__来查看模块名:
当作脚本运行:
__ name__ 等于’__ main__'
当作模块导入:
__ name__ = 模块名
作用:用来控制.py文件在不同的应用场景下执行不同的逻辑

if __ name__ == ‘__ main__’
def fib(n):
    a, b = 0, 1
    while b < n:
        print(b, end=' ')
        a, b = b, a+b
    print()
if __name__ == "__main__":
    print(__name__)
    num = input('num :')
    fib(int(num))
View Code

模块搜索路径

模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块

1. 无论是import形式还是from…import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法
2. 包是目录级的(文件夹级),文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录)
3. import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件
强调:

1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错

2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包即模块

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/models.py','w'))
map(lambda f:f.close() ,l)
# 创建文件夹和目录
View Code
 
1.凡是在导入时带点的,点的左边都必须时一个包
2.from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c是错误语法
#在__init__.py中定义
x=10
def func():
    print('from api.__init.py')
__all__=['x','func','policy']
View Code

绝对导入和相对导入

绝对导入:以文件名(如glance)作为起始
相对导入:用. 或者…的方式最为起始(只能在一个包中使用,不能用于不同目录中)

在glance/api/version.py
#绝对导入
from glance.cmd import manage
manage.main()
#相对导入
from ..cmd import manage
manage.main()
View Code

注意:

可以用import导入内置或者第三方模块(已经在sys.path中),但是要绝对避免使用import来导入自定义包的子模块(没有在sys.path中),应该使用from… import …的绝对或者相对导入,且包的相对导入只能用from的形式。

猜你喜欢

转载自www.cnblogs.com/study-learning/p/9699913.html