• 12章模块


    1.名称空间(名称到对象的映射)

      a. 在执行期间有两个或三个名称空间(局部,全局, 内建),其中局部在执行期间不断变化,从名称空间中访问这些名字依赖于加载顺序。首先解释器加载内建名称空间,由__builtins__模块中名字构成,随后加载执行快的全局名称空间,它会在模块执行后变为活动名称空间。

    (__builtins__和__builtin__模块区别,__builtins__模块包含内建名称空间内建名字的集合,大多数来自__builtin__模块,该模块包含内建函数,异常以及其他属性,标准执行

    环境下__builtins__包含所有__builtin__名字)

    在执行期间调用一个函数,将创建出局部名称空间

         b. 访问一个属性时解释器必须在三个名称空间中的一个找到它, 查找顺序局部--全局--内建

    2.导入模块

      使用import 一次导入多个模块和分多次导入,性能没什么区别

      如果在一个模块顶部导入,作用域是全局,在函数内部导入,作用域是局部

    3. 模块导入的特性

      a. 加载模块会导致这个模块被"执行",包括检查如__name__的操作即存在__name__ == "__main__"执行后续代码。

      b. 一个模块只被加载一次,即如果模块导入sys模块,而其他要导入的模块中也导入sys,那么加载只在第一次时进行。

      c. 只从模块导入名字,那么这些名词会成为局部名称空间的一部分,可能导致覆盖一个已经存在相同名字的对象。

    例如:提供两个模块代码:一个导入者impter.py和一个被导入者imptee.py, impter.py使用from-import创建局部绑定

    #imptee.py
    foo = 'abc'
    def show():
        print 'foo from imptee', foo
    #impter.py
    from imptee import foo, show
    show()
    foo = 1234
    print 'foo from impter', foo
    show()

    运行程序,发现从被导入者观点看, foo值没有改变即使在impter.py中修改了

    foo from imptee abc

    foo from impter 1234

    foo from imptee abc

    当使用import 完整的标识符名称

    #impter.py
    import imptee
    imptee.show()
    imptee.foo = 1234
    print 'foo from impter', imptee.foo
    imptee.show()

    foo from imptee abc

    foo from impter 1234

    foo from imptee 1234

    4. 模块的内建函数

      globals()和locals()分别返回调用者全局和局部名称空间的字典,

      reload()可以重新导入一个已经导入的模块,参数为模块自身

      

  • 相关阅读:
    vue-cli3项目引用zepto报$不存在怎么处理
    RocketMQ(五):server端处理框架及消费数据查找实现
    文件上传踩坑记及文件清理原理探究
    ES使用总结 --ES实践速查手册
    java 执行shell命令及日志收集避坑指南
    Hive 如何快速拉取大批量数据
    程序员表白程序,哈哈哈,笑死我了
    发现了一个好玩的辞职程序,哈哈哈,笑死我了
    为什么最新版的VS2017没有net framework 4.6.2,net framework 4.7.2,net framework 4.6.2,net framework 4.8,也无法安装
    各个版本 Windows 10 的名称、完整版本号、开发代号和系统自带的 .NET Framework 版本
  • 原文地址:https://www.cnblogs.com/gcm688/p/5215518.html
Copyright © 2020-2023  润新知