zoukankan      html  css  js  c++  java
  • 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 ...的方式进行导入。

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

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

  • 相关阅读:
    EXTJS 4.2 资料 控件之checkboxgroup的用法(静态数据)
    EXTJS 4.2 资料 控件之Window窗体相关属性的用法
    EXTJS 4.2 资料 控件之textfield文本框加事件的用法
    Entity Framework 学习笔记(一)之数据模型 数据库
    EXTJS 4.2 资料 控件之checkboxgroup的用法(动态数据)
    EXTJS 4.2 资料 控件之Grid 列鼠标悬停提示
    Entity Framework 学习笔记(二)之数据模型 Model 使用过程
    EXTJS 4.2 资料 控件之radiogroup 的用法
    EXTJS API
    vue移动端弹框组件,vue-layer-mobile
  • 原文地址:https://www.cnblogs.com/zxw-xxcsl/p/12665960.html
Copyright © 2011-2022 走看看