9.包&&命名空间

末鹿安然 提交于 2020-03-25 19:31:45

3 月,跳不动了?>>>

9.包&&命名空间

名字空间和作用域

定义

    名称空间(Namespace)是名字和对象的映射
        A  namespace   is a mapping from names to objects
    名称空间是一个字典,其中键是名字,值是对象
    内建、模块、函数、类都有自己的名称空间
        Python的built-in names(包括内置函数,内置常量,内置类型)
        模块的全局名称global names(这个模块定义的函数,类,变量)
        函数的局部名称local names
名称空间通过__dict___属性和dir( )函数查看
        >>> dir(M3)
        ['C', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'i', 'math', 'printmsin', 'prints', 'printx', 's', 'x']
        >>> list(M3.__dict__.keys())
        ['prints', '__builtins__', 'printx', '__file__', 'C', '__package__', 'printmsin', 'i', 's', 'x', '__name__', '__doc__', 'math']
作用域
    
    作用域(Scope)即一个作用范围,表示名称空间可被访问的范围
        A  scope  is a textual region of a Python program where a namespace is directly accessible.
        语义作用域,变量的作用域完全是由变量在程序文件中源代码的位置而决定的,而不是由函数调用决定。
    根据Python的命名空间,可以得到如下的作用域
        内部函数的局部作用域
        外层函数的局部作用域
        模块的全局作用域
        Python内置对象的最外层作用域
    函数定义了本地作用域,模块定义了全局作用域
LEGB查找原则
    
    当引用一个变量时,Python按以下顺序依次进行查找:从本地变量中,在任意上层函数的作用域,在全局作用域,最后在内置作用域中查找。
    第一个能够完成查找的就算成功;变量在代码中被赋值的位置通常就决定了它的作用域。

作用域

作用域 作用域(Scope)即一个作用范围,表示名称空间可被访问的范围 A scope is a textual region of a Python program where a namespace is directly accessible. 语义作用域,变量的作用域完全是由变量在程序文件中源代码的位置而决定的,而不是由函数调用决定。 根据Python的命名空间,可以得到如下的作用域 内部函数的局部作用域 外层函数的局部作用域 模块的全局作用域 Python内置对象的最外层作用域 函数定义了本地作用域,模块定义了全局作用域

LEGB查找原则

当引用一个变量时,Python按以下顺序依次进行查找:从本地变量中,在任意上层函数的作用域,在全局作用域,最后在内置作用域中查找。
第一个能够完成查找的就算成功;变量在代码中被赋值的位置通常就决定了它的作用域。

功能 明确变量使用范围 防止变量名称冲突

        M1.py
            #!/usr/bin/env python
            # -*- coding:UTF-8 -*-
            x = 1
            def printx():
                'it is a module!'
                print x + 2
        M2.py
            #!/usr/bin/env python
            # -*- coding:UTF-8 -*-
            x = 1
            s = '测试'
            def printx():
                'it is a module!'
                print x + 2
            def prints():
            print s
        >>> from M1 import *
            直接导入M1模块的全局命名空间到内存
        >>> print x
        1
        >>> printx
            全局作用域/命名空间下调用printx函数
        <function printx at 0x10c2c68c0>
        >>> printx()
        3
        >>> 
        >>> x = 10
            全局作用域下/命名空间下将x值从1修改为10
        >>> print x
        10
        >>> from M2 import *
            导入M2模块,M2的命名空间直接覆盖本地全局命名空间
        >>> print x
            x的值又被修改
        1

包(Package)

定义

包(Package)是一种层次化的程序组织结构,由一系列子包和模块组成
    上面图片中MOD表示当前目录
    d1是MOD下面的第一级目录
    d2和d3是d1下面的目录
    d2m1/d2m2/d3m1/d3m2是d2和d3里面的模块
类似模块,可以通过import和from...import语法导入,可以通过点号语法访问
与模块最大不同的是,包通常由模块和__init__文件组成
    包导入语句的路径中的每个目录内都必须有__init__.py这个文件,否则导入包会失败
    __init__.py是一个初始化模块,Python首次导入某个目录时,会自动执行该目录下__init__.py文件中的所有代码
    __init__.py文件可以直接是一个空文件,但也可以为包执行初始化语句或设置__all__等变量

语法

import package1.package2.module
    from package1.package2 import module

功能 解决模块命名冲突 简化模块搜索路径设置 实现模块与模块之间的关联 方便大型程序层次化组织 方便第三方组件拓展 第三方组件采用包组织来分发

举例

    例1
        说明
            sys.path /Users/jaykingchen/MOD
            d1
                处于当前工作目录MOD下面
                __init__.py
                a = 1
                print 'dir1'
                d2
                __init__.py
                b = 2
                print 'dir2'
                d2m1.py
                c = 3
                print 'it is a module.py'
        >>> import d1.d2.d2m1
        dir1
        dir2
        the d2m1.py
        >>> d1.a
        1
        >>> d1.d2
        <module 'd1.d2' from '/Users/jaykingchen/MOD/d1/d2/__init__.py'>
        >>> d1.d2.b
        2
        >>> d1.d2.d2m1
        <module 'd1.d2.d2m1' from '/Users/jaykingchen/MOD/d1/d2/d2m1.py'>
        >>> d1.d2.d2m1.c
        3
    例2
        说明
            包导入环境下,采用from...import语句,可以简化模块/函数/变量的调用,无需输入完整路径
        >>> from d1.d2 import d2m1
            >>> from d1 import d2
            >>> d2.b
            2
            >>> d2.d2m1.c
            3
        dir1
        dir2
        the d2m1.py
        >>> d2m1.c
        3
        小结
            若包目录中,所有模块名字唯一,则可以通过from...import...语句导入,简化模块中函数和变量等调用
            若包目录中,有些模块的名字重叠,则需要通过import语句,之后采用点号语法进行函数/变量调用,保证唯一性

包的管理工具

定义 包管理涉及打包、分发、下载、编译、安装等环节 不同环境由不同的包管理工具来执行

工具

pip 2008年分布 pip是easy_install的取代,大量的组件基于原有的setuptools windws升级最新pip python -m pip install --upgrade pip

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!