模块和包

一、模块

1、什么是模块?? 模块是一组功能的集合,别人写好的函数 变量 方法 放在一个文件里 (这个文件可以被我们直接使用)这个文件就是个模块

2、如何自己写一个模块

创建一个py文件,给它起一个 符合变量名命名规则的名字,这个名字就是模块名

写一个简单的my_module模块

1 name = 'egon'
2 def read1():
3      print('main read1')

3、调用一个模块

1 import my_module
2 name='Bart'
3 def func():
4     print('aaaaaaa')
5 print(name)
6 print(my_module.name)

第一行打印:"Brat"
第二行打印:"egon"

当模块被调用时,为模块分配一个内存地址,import的命名空间,模块和当前文件在不同的命名空间中

判断模块是否被导入

1 import sys
2 
3 print(sys.modules)

4,模块的导入过程

找到这个模块
判断这个模块是否被导入过了
如果没有被导入过
创建一个属于这个模块的命名空间
让模块的名字 指向 这个空间
执行这个模块中的代码

5、给模块起别名,之后都需要使用别名引用变量了

 1 import my_module as m
 2 m.read1()
 3 
 4 json pickle
 5 dumps loads
 6 def func(dic,t = 'json'):
 7      if t == 'json':
 8          import json
 9          return json.dumps(dic)
10      elif t == 'pickle':
11          import pickle
12          return pickle.dumps(dic)
13 
14  def func(dic, t='json'):
15      if t == 'json':
16          import json as aaa
17      elif t == 'pickle':
18          import pickle as aaa
19      return aaa.dumps(dic)

 导入多个模块

模块顺序:内置模块、第三方模块、自定义莫夸

二、from import .......

1、from.......import.......import谁就只能用谁

1 from import的过程中仍然执行了这个被导入的文件
2 
3 from my_module import read1
4  # import谁就只能用谁
5 read1()
6 from my_module import read2
7 read2()

2、当前文件的命名空间和模块的命名空间问题

1 from my_module import read1
2 def read1():
3      print('in my read1')
4 read1()
5 
6 from my_module import read2
7 read2()

当模块和当前命名空间存在相同的变量时,模块里的变量名被覆盖
直接调用当前命名空间变量

from.......import........的过程

# 1.找到要被导入的模块
# 2.判断这个模块是否被导入过
# 3.如果这个模块没被导入过
    # 创建一个属于这个模块的命名空间
    # 执行这个文件
    # 找到你要导入的变量
    # 给你要导入的变量创建一个引用,指向要导入的变量

 导入多个变量

1 from my_module import read1,read2
2 read1()
3 read2()

 给导入的名字起别名:和import是一样的

3、*和__all__

*,from my_module import* 引入所有的变量,可以直接使用(和import my_module相似)

__all__=['变量1 ','变量2 ','变量3 '............]

__all__写在模块里,能够约束*导入的变量的内容,只有写在__all__里的变量才能被使用

 

三、模块的加载与修改

1、模块之间的循环调用

模块之间不能循环调用,可以单向调用,不能构成回路

2、import.........  加载、修改

已经被导入的模块如果被修改,执行时不会被修改,从新加载启动这个程序执行新的内容

3、将模块当做脚本执行

执行Python的两种方式

  1、在cmd里执行、在Python执行这个文件---------->以脚本的方式执行

  2、如果导入这个py文件,这个py文件就是模块

当一个py文件

  当成脚本的时候,能够独立提供一个功能,能自主完成交互

  当成一个模块的时候,能够通过调用执行这个功能,不能自主完成交互

一个文件的__name__变量

  当这个文件被当做脚本执行的时候__name__=='__main__'

  当这个文件被当做模块导入的时候__name__=='模块的名称'

关键的代码********

if  __name__="__main__"
    pass

当文件被当成脚本执行的时候判断是否是main,如果是就执行这个脚本
当文件被当成模块执行的时候可以直接调用这个功能

 

模块的搜索路径

导入在同一层下的文件可以直接导入

要导入不同目录下的文件,要加载要导入的文件的目录需要修改sys.path()列表

把要导入的模块的路径添加到列表里

1 import sys
2 path="要导入的模块的路径"
3 sys.path.append(path)

之后可以直接导入这个模块

从包里导入模块

包:文件夹里有一个__init__.py文件,是几个模块的集合

用import /from....import导入包

1 # import 方法引入包
2 import glance.api.policy
3 glance.api.policy.get()
4 #
5 import glance.api.police as policy
6 policy.get()
1 #点的左边必须是包,否则非法
2 from glance.api import police
3 police.get()
4 #
5 from glance.api.policy import get
6 get()

包的绝对导入和相对导入
 导入一个包不意味着这个包下面的内容都是可以用的

导入一个包的过程:导入一个包就相当于执行了这个包下面的__init__文件

绝对导入:通过设计被导入包下的__init__来完成导入包之后的操作。缺点:当包的路径发生改变,__init__里的文件就发生改变,需要做相应的调整

相对导入:直接从上一级导入

posted @ 2018-08-23 16:29  神神气气  阅读(133)  评论(0编辑  收藏  举报