Day25 python基础---面向对象进阶--模块与包

一,模块

  import:

  Q1:在import的过程中发生了哪些事情

    相当于执行了这个模块,但是一个模块不能被重复导入

  Q2:被导入的模块和本文件之间命名空间的关系

   import模块的时候发生的事情

    1.寻找模块

    2.如果找到了,就开辟一块空间,执行这个模块

    3.把这个模块中用到的名字都收录到新开辟的空间中

    4.创建一个变量来引用这个模块的空间

   导入模块时需要注意:

    1.模块不会被重复导入

    2.模块和文件之间的内存空间始终是隔离的

    3.模块的名字必须是符合变量命名规范的

# 使用被导入模块中的名字
import my_modul2
print(my_module2.name)
my_module2.read1()
name = 'alex'
print(name)
#可以修改模块内变量的指向
import my_module2
my_module2.read12()
name = 'alex'
my_module2.read12()
my_module2.name = 'alex'
my_module2.read12()

  Q3:导入多个模块的方法   

#导入多个模块
import time,os,my_module2

#注意:pep8规范
import time
import os
import my_module2
#内置,第三方,自定义,规范需要按顺序导入

  Q4:给导入的模块起别名

#给模块起别名,起了别名,原来的模块名就不能用
import my_module2 as m
print(m.name)
print(my_module2.name)  #NameError: name 'my_module2' is not defined

#应用:
def dump(method):
    if method == 'json':
        import json as m
    elif method == 'pickle':
        import pickle as m
    with open('file', 'w') as f:
        m.dump([1,2,3],f)

  Q5:模块搜索路径

# 模块搜索路径
import sys
print(sys.path)
import my_module2

#正常的sys.path中除了内置。扩展模块所在的路径之外
#只有一个路径是永远不会出问题
    #你直接执行的这个文件所在的目录,sys.path的第一个是正确的
    #sys.path第二个是项目目录,不靠谱
#一个模块是否能被导入,就看这个模块所在的目录在不在sys.path中
import my_module3  #ModuleNotFoundError: No module named 'my_module3'  路径出问题

  Q5:模块与脚本的关系

#两种运行一个py文件的方式
#直接运行它:cmd python xx.py    pycahrm  : 脚本
#执行一个脚本时__name__ ==> '__nain__'
#导入它 :模块 #当这个脚本被当成模块导入时 #__name__ ==> '模块名'

  关于:if __name__ == '__main___'

if __name__ == '__main__':
若本作为模块被导入时,将不需要执行的代码放入其中
函数调用和打印操作一般放在此主函数下
若不是直接执行本文件的话,主函数不会被执行

  

  from ... import

  Q1.在from import的过程中发生了哪些时期

    1.寻找模块

    2.如果找到了,就开辟一块空间,执行这个模块

    3.把这个模块中用到的名字都收录到新开辟的空间中

    4.创建一个变量来引用这个模块的空间

  Q2:被导入的内容和本文件之间命名空间的关系

from my_module2 import read1
read1()
from my_module2 import read12   #readl2有引用模块内的变量name
name = 'alex'  #创建一个全局变量并指向'alex'
read12()    #两个名称空间互相隔绝,不受影响
import sys
print(sys.modules)


name = 'alex'    # 创建一个全局变量并指向'alex'
from my_module2 import name   #把模块空间内的变量name指向全局变量name
print('name')

  Q3:from import多个内容,给导入的内容起别名,*和__all__用法

from my_module2 import name,read1,read12 #同时导入多个
from my_module2 import name as n,read1 as r1,read12 as r2  #同时导入多个并重命名
from my_module import *  #导入全部,正常情况,该模块内用的小的化,不建议使用,可读性差
__all__ = ['name'] #在模块中定义,可跟*配合,有定义的导入后才能用,没定义导入后不能用

  

  补充:

# 补充的内容
#1.pyc文件,pyi文件  *
    #pyc:被编译好的字节码模块文件,当模块第一次被导入时会产生一个pyc文件,当第二次被导入
#时,就直接执行编译好的pyc模块文件,当模块源码变更时,会重新编译生成pyc文件
    #可以提高程序的启动效率,并不能提高执行效率

    #pyi:与py后缀差别不大

#2.模块的导入和修改 *
import time
import my_module2   #导入时就已经在内存加载好,在期间修改模块,程序执行不受影响
print(my_module2.name)
time.sleep(10)     #在期间修改模
print(my_module2.name)
import my_module2   #不能多次导入,不生效
print(my_module2.name)
from importlib import reload #不建议多次reload模块,影响程序执行效率 import time import my_module print(my_module2.name) time.sleep(10) #在期间修改模块 reload(my_module2) #可以重新加载模块 print(my_module2.name) #3.模块的循环引用 **** #当使用循环引用时,会造成两边的模块内的代码还没有加载完成就结束导入,导致引用失败 #可以先单当面引用,待一边加载完成后,再(条件)触发另一边的引用,实现循环引用 #4.dir(模块名) *** import my_module2 print(dir(my_module2)) #可以获取这个模块中的所有名字,并可以利用反射获取

二,包

  Q1:什么是包(package)

    含有一个__init__.py的文件夹就是一个包

    包中通常含有一些py文件

    提供一组复杂的功能

    在py3中,模块可以相互导入

    在py2中,在同一个中的模块才能互相导入

  Q2:从包中导入模块

#从包中导入模块 ****

import  glance2.api.policy  #这个形式终点必须是一个模块
# import  glance2.api.policy.get  #error:点的左边必须是一个包,不能是一个模块
glance2.api.policy.get()

import  glance2.api.policy as policy #起别名
policy.get()


from  glance2.api import policy   #from import 形式
policy.get()
from glance2.api.policy import get
get()

  Q3:直接导入包 **

# 绝对导入

#导入包的过程发生了什么事?
#相当于执行了这个包的__init__.py文件
#sys.path的内容 永远是当期你执行的文件
glance2.api.policy.get()

#相对导入  
#运用了相对导入的文件不能直接执行
#'.'表示当前目录
#'..'表示上级目录
# import glance3
from outer import glance3

    

原文地址:https://www.cnblogs.com/lianyeah/p/9606908.html