zoukankan      html  css  js  c++  java
  • 模块和包

    一、模块

    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__里的文件就发生改变,需要做相应的调整

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

  • 相关阅读:
    Python中CreateCompatibleDC和CreateBitmap造成的内存泄漏
    POJ 2420 模拟退火
    LR(1)分析表-语法树-四元式
    C语言文法
    计蒜客 18018 热爱工作的蒜蒜 最短路+dp
    HDU 5988 最小费用流
    POJ 1808 平方剩余
    POJ 2115 单变元模线性方程
    计蒜客 17414 Exponial 指数降幂公式
    计蒜客 17412 Card Hand Sorting 最长公共子序列
  • 原文地址:https://www.cnblogs.com/liaopeng123/p/9524591.html
Copyright © 2011-2022 走看看