• python全栈闯关--21-模块和包


    模块

    mymoudle

    # -*- coding:utf-8 -*-
    print('form my_moudle.py')
    
    money=1000
    
    def read1():
        print("my_moudle read1",money)
    
    def read2():
        print("my_moudle read2")
    
    def change():
        global money
        money = 0

    1、使用import导入模块

    import sys
    import my_module
    import my_module
    import my_module
    import my_module
    print(sys.path)
    print(sys.modules.keys())

    导入模块,会按照当前路径,pytchon解释器的方式去寻找包的路径。

    多次导入包,不会重复导入。会根据sys.mmodules里面的值进行判别,包是否已经导入。

    money=10
    print(m.money)
    print(money)

    包有自己的命名空间,不与当前目录冲突

    def read1():
        print('this is in main')
    
    read1()
    m.read1()

    函数也不与当模块中冲突

    m.change()
    print(money)
    m.read1()

    虽然moudle中,定义了全局变量,但是修改的还是moudle中的值。

    导入模块时,第一步,创建模块的命名空间,如果定义了global,引用的依然是命名空间中的模块;

    第二部,执行模块中的代码

    使用import as 别名来导入模块

    导入后,可以使用别名来进行操作,以到达简化代码的目的。

    可以通过参数,判断导入不同的参数,简化代码

    2、from import

    from my_module import read1
    def read1():
        print('this is in main')
    money = 10
    read1()

    本函数中的read1覆盖了导入的read1

    from my_module import read1
    # def read1():
    #     print('this is in main')
    money = 10
    read1()

    虽然修改了本模块中的money,但是调用的依然是my_module中的值

    from my_module import read1
    from my_module import read2
    def read1():
        print('this is in main')
    # money = 10
    # read1()
    
    read2()

    read2中引用了read1,执行结果使用的money依然是模块中的money

    __all__参数

    __all__参数与from import * 组合使用,用于过滤导入的数据。只有子all中的函数、变量才会被导入

    from my_module import *
    print(read1)
    print(read2)
    print(money)
    print(change)

    没加all参数前,可以导入全部函数、变量

    在module中添加all参数后

    __all__ = ['read1', 'read2']

    ```

    <function read1 at 0x000001F2D1CBE0D0>
    <function read2 at 0x000001F2D1CBE1E0>
    print(money)
    NameError: name 'money' is not define

    ```

    就只导入了read1和read2

    import time,day21.imlib as i
    import importlib
    time.sleep(30)
    importlib.reload(i)
    i.func1()

    如果导入包后,修改了模块,结果不会反应到已经加载的模块中,此时,就需要使用importlib来重新加载包。

    如上例子中,如果在休眠的30秒内,修改了imlib,最终执行的不会是罪行的imlib。

    使用importlib.reload重新加载后,更新到最新的代码。

    包导入有两种方式:

    一、import

    二、from .... import ....

    使用import导入,需要录入完整的路径,到模块名,使用时,使用完整的路径名

    import glance.cmd.manage as m
    m.main()

    不取别名,会要求整个路径的输入才能使用

    from ... import ....

    导入的变量,函数可以直接使用

    from glance.cmd.manage import *
    main()

    直接使用main()

    __init__.py文件

    使用import和from ... import ... 时,只导到包名时,会自动加载此文件中的代码

    即__init__文件起到一个预效验的作用,导入路径指定到包名,将会按照此文件中的内容进行加载

    import glance.api as p
    p.policy.get()
    p.func()

    在api的__init__.py文件中写入了导入

    x=10
    
    def func():
        print('this is func from api.__init.py')
    
    import glance.api.policy
    __all__ = ['func','x','policy']
    print('from api.__init1111.py')

    导入了__init__下的函数变量,也根据文件导入了policy里面的内容

    from  glance.api import *
    policy.get()
    func()

    使用from倒入了,到达了和import导入一样的效果,只是调用的方式不同

    另外,from和模块一样可以使用__all__参数

    __all__ = ['x','policy']

    __all__参数,过滤掉了func,此时调用func报错。通一路径下的模块:policy写到了all里面,init中可以不用写导入此模块,也可导入。

    相对导入和绝对导入

    包中模块使用到其他包里面的内容时,有两种导入方式。

    一、绝对导入,使用完整的包名进行导入。

    from glance.cmd import manage
    manage.main()
    import glance.cmd as m
    m.manage.main()

    二、相对导入

    from ..cmd import manage
    manage.main()

    . 代表当前路径,.. 代表父路径

    子模块中,互相导入需要杜绝使用import来进行导入。使用from ... import  ... 来进行导入。

    import一般使用来导入内置模块和三方模块(已经存在于sys.path)中的数据,包子模块中的导入,使用from ... import ...的方式进行导入。

     如果绝对路径导入,在包模块中,可以执行代码;

    如果使用了相对路径,包子模块中代码将不可运行

  • 相关阅读:
    如何使用Tomcat
    Android推送通知指南(转)
    路由器
    供应链是什么意思
    c#打印(通过Word)
    RFID(电子标签、射频识别)技术在医疗行业中的应用
    无线数传DTU
    在C#中获取打印机的当前状态
    CCD是什么
    Failed to enable constraints. One or more rows contain values violating nonnull, unique, or foreignkey constraints.
  • 原文地址:https://www.cnblogs.com/zxw-xxcsl/p/12665960.html
Copyright © 2020-2023  润新知