zoukankan      html  css  js  c++  java
  • 模块进阶

    模块进阶

    python的源代码按功能可分为两种

    1.用于执行的文件

    2.用于被导入当做模块的文件

    模块查找顺序

    1.先从内存中已经导入的模块中寻找(sys.moudle)

    2.内置的模块(time等)

    3.自定义模块(执行文件所在目录)

    4.环境变量sys.path中找(PYTHONPATH环境变量,但是可以在代码中动态添加)

    5.标准库路径(python安装的地方)

    6.pth文件自定义路径(在python安装目录新增加mypath.pth文件)

    模块重载

    我们已经知道,模块导入只会执行一次模块的代码,虽然好处很多,但是我们就需要重新执行模块的代码怎么办呢?

    from imp import reload
    reload(zx)
    

    reload()会重新执行模板文件,但不会建立新的模板对象,会在原来的的对象上修改

    from模块导入和执行文件重名

    首先优先使用的是执行文件定义的全局变量

    执行文件a.py

    from  b import x,y,z,c
    
    x=1
    y=[1,2]
    z={1:2}
    
    print(x,y,z,c)
    

    模块文件b.py

    x="a"
    y=['a','b']
    z={'a':'b'}
    c=2
    
    print(x,y,z)
    
    a ['a', 'b'] {'a': 'b'}
    1 [1, 2] {1: 2} 2
    

    from导入模块的属性作为全局变量

    上面的c属性其实经过了一步这样的操作

    c=b.c
    

    这样其实就相当于在执行文件中自己创建了一个全局变量

    __main__

    每一个.py文件都相当于一个模块,当运行的当前的.py文件,也会生成一个模块对象,这个模块的名字为__main__,然后运行当前文件的属性和方法,其实相当于默认带了当前模块对象这个前缀。

    一个很好的例子

    aaaa.py

    import bbbb
    
    zx="a"
    print(bbbb.__name__)
    if __name__ == '__main__':
        pass
    

    bbbb.py

    zx="b"
    print(__name__)
    

    运行aaaa.py

    bbbb
    b
    bbbb
    __main__
    a
    

    从运行结果可以发现,只有当前运行的文件模块名为__main__,其他模块的名字就是py文件的名称,同理可得,如果从bbbb中import aaaa的话,是进不去if判断的,那个时候模块名就为aaaa了

    dir()

    如何查看模块的定义了哪些属性(全局名称空间)

    使用dir()内置方法

    默认查看当前的属性,参数可以为导入的模块对象

    案例

    可以看到只会打印出全局的属性,函数内部的局部名称空间属性不会打印

    执行文件a.py

    import bbbb
    
    x=1
    y=[1,2]
    z={1:2}
    
    def zx():
        i=0
    
    print(dir())
    
    print(dir(bbbb))
    
    ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'bbbb', 'x', 'y', 'z', 'zx']
    ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'x', 'xx', 'y', 'z']
    

    模块文件bbbb.py

    x="a"
    y=['a','b']
    z={'a':'b'}
    
    def xx():
        xxx=10
    
  • 相关阅读:
    2020年. NET Core面试题
    java Context namespace element 'component-scan' and its parser class ComponentScanBeanDefinitionParser are only available on JDK 1.5 and higher 解决方法
    vue 淡入淡出组件
    java http的get、post、post json参数的方法
    vue 父子组件通讯案例
    Vue 生产环境解决跨域问题
    npm run ERR! code ELIFECYCLE
    Android Studio 生成apk 出现 :error_prone_annotations.jar (com.google.errorprone:error) 错误
    记忆解析者芜青【总集】
    LwIP应用开发笔记之十:LwIP带操作系统基本移植
  • 原文地址:https://www.cnblogs.com/zx125/p/11498034.html
Copyright © 2011-2022 走看看