python 模块和包

模块和包:

  1.如何自己写一个模块

  import 模块名
  模块的导入相当于这个模块所在的文件,模块的多次导入不会重复执行
  命名空间
   为模块起别名 as 语句
   一行导入多个模块 : 内置 第三方 自定义
  from import
   命名空间 名字引用模块中的名字
   为导入的名字起别名
   一行导入多个名字
   *和__all__的关系 : __all__只能约束*

  
  示例文件:自定义模块my_module.py,文件名my_module.py,模块名my_module
  
#my_module.py
print('from the my_module.py')

money=1000

def read1():
    print('my_module->read1->money',money)

def read2():
    print('my_module->read2 calling read1')
    read1()

def change():
    global money
    money=0

  模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块很import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载大内存中的模块对象增加了一次引用,不会重新执行模块内的语句),如下 

#demo.py
import my_module #只在第一次导入时才执行my_module.py内代码,此处的显式效果是只打印一次
          #'from the my_module.py',当然其他的顶级代码也都被执行了,只不过没有显示效果.
import my_module import my_module import my_module ''' 执行结果: from the my_module.py '''



  模块引用中的情况 :
   1.模块的循环引用 ***
   模块之间不允许循环引用
   2.模块的加载与修改 *
   已经被导入的模块发生了修改,是不会被感知到的
   要想修改的模块被正在运行中的程序感知到,重启这个程序
   3.把模块当成脚本执行 *****
   if __name__ == '__main__':
   代码
   写在这里面的代码只有这个文件被当做脚本执行的时候才执行
   4.模块的搜索路径 *****
   和被当做脚本执行的文件 同目录下的模块,可以被直接导入
   除此之外其他路径下的模块 在被导入的时候需要自己修改sys.path列表

包:
  包是一种通过使用‘.模块名’来组织python模块名称空间的方式。

1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法

2. 包是目录级的(文件夹级),文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录)

3. import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件

强调:

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

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

从包中导入模块:

  

import
import glance.api.policy
glance.api.policy.get()

import glance.api.policy as policy
policy.get()

from import
from glance.api import policy
policy.get()

from glance.api.policy import get
get()
原文地址:https://www.cnblogs.com/zbw582922417/p/9525644.html