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
    
  • 相关阅读:
    怎么加载用户自定义控件
    一个C#委托的示例
    signed add
    避免QuartusII中将没有进行定义的信号自动生成wrie类型
    serial_to_parallel
    用modelsim仿真——对文件的操作
    base of logic
    blocking PK nonblocking
    parallel to serial
    使用signalTapII看综合掉的wrie和register的值
  • 原文地址:https://www.cnblogs.com/zx125/p/11498034.html
Copyright © 2011-2022 走看看