zoukankan      html  css  js  c++  java
  • 模块,import,from xxx import xxx

    一,模块

      模块就是一个包含了python定义和声明的文件,文件名就是模块的名字加上.py后缀,总体来说,import加载的模块一共分成四个通用的类别:

      1,使用python编写的py文件

      2,已被变异为共享或者DLL或者C++的扩展

      3,包好一组模块的包

      4,使用c编写并连接到python解释器的内置模块

      为什么要使用模块?为了我们写的代码可以重用不至于把所有的代码都写在一个文件内,当项目规模比较小的时候,完全可以使用一个py搞定整个项目的开发,但是如果是一个非常大的项目,此时就必须要把相关的功能进行分离,方便我们日常维护,以及新项目的开发,导入模块有两种方式:

      1,import 模块

      2,from xxx import xxx

    二,import

      首先建一个tang.py文件。 

    name='糖糖'
    def xihuan():
        print('%s喜欢看小说'%name)
        print('她喜欢画画')
        print('她喜欢喝冰红茶')
        print('她喜欢吃胡豆')
    xihuan()

      接下来,再建一个py文件,在这个文件中导入tang模块。

    import tang   #此时运行新建的py文件时,会默认执行tang模块中的代码
    import tang #不管后面调用几次,都是没有效果的,模块是不能够重复导入的
    import tang
    print(tang.name)
    tang.xihuan() #在引入模块后,就可以调用tang模块中的属性和方法

      导入模块的时候都做了些什么?首先,在导入模块的一瞬间,python解释器会先通过sys.mudules来判断该模块是否已经导入过了,如果导入过了就不在导入,如果该模块还没导入过,则系统会做三件事:

      1,为导入的模块创立新的名称空间

      2,在新创建的名称空间中运行该模块中的代码

      3,创建模块的名字,并使用该名称作为该模块在当前模块中引用的名字

      注意:由于模块在导入的时候会创建自己的名称空间,所以,我们在使用模块中的变量的时候一般是不会产生冲突的。

    import tang
    name='糖儿'
    tang.xihuan()  #结果还是用的是tang中的‘糖糖’

      注意:在模块中使用global,我们之前说global表示把全局的内容引入进到局部,但是,这个全局指的是py文件,换句话说,global指向的是模块内部,并不会改变外部模块的内容

    tang.py
    name='糖糖'
    def xihuan():
      global name
      name='糖糖糖'
      print(name)

    111.py
    import tang
    name='唐儿'
    tang.xihuan() #结果是‘糖糖糖’
    print(name) #结果是‘唐儿’

      特别要注意,如果我们在不同的模块中引入同一个模块,并且在某一个模块中改变了被引入模块中的全局变量,则其他模块看到的值也随之改变,原因是python的模块只会引入一次,大家共享同一个名称空间

    tang.py
    name=''
    
    111.py
    import tang
    tang.name='糖糖'
    #if __name__ == __main__: 此时,只有在111py文件为执行文件时才会改变值
      #tang.name='糖糖’
    112.py import tang import 111 print(tang.name) #结果是‘糖糖’

    113.py
    import tang
    import 111
    #print(tang.name) #而此时,结果就不在是‘糖糖’,而是‘糖’

      我们可以对引入的模块重新命名,还可以一次性引入多个模块

    import tang as t
    print(t.name)  #这样也行的

    import time,random,json,tang #一次引入多个,但引入的顺序是有规定的

      正确的导入模块的顺序:

      1,所有的模块导入都要写在最上面,这是最基本的

      2,先引入内置模块

      3,在引入扩展模块

      4,最后引入自定义的模块

    三,from xxx import xxx

      其实就是选择性的导入

    tang.py
    name='糖糖' def xihuan(): print('%s喜欢看小说'%name) print('她喜欢画画') print('她喜欢喝冰红茶') print('她喜欢吃胡豆') xihuan()

    from tang import xihuan
    xihuan() #直接使用就可以,不用tang.

      但是这有个坑,当我们从一个模块中引入一个变量的时候,如果当前文件中出现了重名的变量时,会覆盖掉模块中引入的那个变量

    tang.py
    name='糖糖' def xihuan(): print('%s喜欢看小说'%name) print('她喜欢画画') print('她喜欢喝冰红茶') print('她喜欢吃胡豆') xihuan()

    from tang import name
    name='静静'
    print(name) #此时结果是‘静静’

     所以,不要重名,切记,不要重名!不仅仅是变量名不要重复,我们创建的py文件的名字不要和系统内置的模块重名,否则,引入的模块都是python内置的模块。

      还有一种特殊的写法,from xxx import *,此时也是把模块中的所有内容导入。注意:如果所导的模块中没有写__all__则默认所有内容导入,但如果写了__all__,此时导入的内容就是__all__列表中列出来的所有名字

    tang.py
    __all__=['name']
    name='糖糖' def xihuan(): print('%s喜欢看小说'%name) print('她喜欢画画') print('她喜欢喝冰红茶') print('她喜欢吃胡豆')
    www.py
    from tang import *
    print(name) #结果是‘糖糖’
    xihuan() #报错

      

  • 相关阅读:
    微信h5下拉隐藏网页,还有取消页面滑动
    vuejs中使用递归嵌套组件
    运行gitbook init命令报错及问题解决办法
    利用python生成gitbook目录文件
    通过Appium日志,分析其运行原理
    字符串两两更换位置
    Dockerfile启动的程序,内存不断增长问题
    测试流程优化
    APP测试面试题(一)
    关于面试总结13-app测试面试题
  • 原文地址:https://www.cnblogs.com/12345huangchun/p/9989676.html
Copyright © 2011-2022 走看看