zoukankan      html  css  js  c++  java
  • import 和from…import

    import 和from…import

    一、import模块名

    import time
    print(time.time())
    

    import首次导入模块发生了3件事:

    使用import time导入的时候,使用方法只能通过time.方法名() ,不能直接方法名

    1. 在内存中生成一个叫做time的名称空间
    2. 将会运行time.py文件,然后把time.py文件内的名称空间放入time的名称空间内
    3. 把time的名称空间执行通过import和from…import… *.py(当前导入time模块的文件)的名称空间中
    

    1.1 导入模块

    模块的重复导入会直接引用之前创造好的结果,不会重复执行模块的文件,即重复导入会发生:spam=spam=模块名称空间的内存地址

    import spam as sm
    
    
    money = 111111
    
    sm.money
    sm.read1()  # 'spam模块:1000'
    sm.read2
    sm.change()
    
    print(money)  # 1000
    

    1.2 导入多个模块

    import sys, time, os
    
    # 推荐使用下述方式
    import sys
    import time
    import os
    

    二、from模块名 import具体的功能

    from time import gmtime
    print(gmtime())
    
    # 注
    from time import *  # 所有(等同于import time),不推荐使用,因为很容易造成变量名冲突
    

    from...import...首次导入模块发生了3件事:

    1. 在内存中生成一个叫做time的名称空间
    2. 运行time.py文件,然后把time.py文件内的名称空间放入到time的名称空间
    3. 把gtime方法执行import和from…import *.py(当前导入time模块的文件)的名称空间内
    

    ​ 优点:不用加前缀,使用模块中的方法更加简洁

    ​ 缺点:容易与当前执行文件中名称空间中的名字冲突

    2.1 导入文件所有功能

    # test.py
    __all__ = ['f1', 'f2']
    
    def f1():
        print('f1')
    
    def f2():
        print('f2')
    
    def f3():
        print('f3')
    
    
    # run.py
    1. * 导入会被限制
    from test import *  # __all__限制了 from test import *
    
    f1()
    f2()
    # f3()     f3() NameError: name 'f3' is not defined
    
    2. 单独导入不会被限制
    from test import f3 # __all__不会限制
    f3()
    
    3. import导入不会被线子
    import test  # __all__ 不会限制
    testt.f3()
    

    三、import和from…import… 的异同

    • 相同点:

      1. 两者都会执行模块对应文件,两者都会产生模块的名称空间
      2. 两者调用功能是,需要跑到定义时寻找作用域关系,与调用位置无关
      3. 当使用其导入会执行导入模块里面的功能(比如:如果有打印就会,被导入的模块就会被中打印语句将会执行)
    • 不同点:

      1. import需要加入前缀
      2. from…import…不需要添加前缀(容易导致与模块中名称空间冲突)

    四、总结

    import发生的事情:

    • 在内存中会生成导入模块的(time)名称空间;
    • 运行time.py文件,会把time.py模块中产生的名称空间装入time的名称空间中;
    • 将import导入的模块(time.py)所产生的名称空间,导入当前所要执行文件的名称空间中;

    引用方法需要模块名加方法名,不能直接写方法名;

    from ... import ...发生的事情:

    • 在内存中会生成导入模块的(time)名称空间;
    • 运行time.py文件,会把time.py模块中产生的名称空间装入time的名称空间中;
    • 把 gtime()方法执行产生的名声空间导入到当前所要执行文件的名称空间;

    引用方法不需要模块名加方法名,而只需写方法名即可,缺点容易与当前文件的名称空间产生冲突

    使用from导入自定义模块,一般是导入同一级目录下模块(当前执行文件中导入),如果不是同一级,则会报错;

    __all__:

    • 使用from .. import * 导入会被限制;
    在当下的阶段,必将由程序员来主导,甚至比以往更甚。
  • 相关阅读:
    KMP+Tire树(模板)
    序列自动机(模板)
    欧拉函数(转载)
    Django之ContentType组件
    RestFramework之注册器、响应器与分页器
    RestFramework之频率组件
    RestFramework之权限组件
    RestFramework之认证组件
    RestFramework之视图组件
    RestFramework之序列化组件
  • 原文地址:https://www.cnblogs.com/randysun/p/11360024.html
Copyright © 2011-2022 走看看