zoukankan      html  css  js  c++  java
  • 浅谈python的import

    动态加载模块:

    使用__import__

    c=__import__('sys')
    

    等价于

    import sys
    

    不过前者可以在执行时决定。

    静态加载:

    也就是常规的import

    from xxx import yyy
    

    or

    import xxx.yyy

    xxx的最小粒度是文件, yyy的最小粒度是文件中的类/变量/函数。

    import寻找对象的顺序:

    1. sys.path

       因为会从这里加载,所以可以通过修改sys.path来修改寻找的范围。

    2. 相对路径

      Pkg--__init__.py

        |----mod1 ----__init__.py

           |            |-mod1.1.py

           |            |-mod1.2.py

           |-mod2-----__init__.py

                        |-mod2.1.py

                        |-mod2.2.py

       注意一个问题。当前如果有使用明确相对路径(explicit relative path)--即使用点号,则避免直接运行当前模块。因为会出错:ValueError: Attempted relative import in non-package。 详细可以参考这里

    明确相对路径,比如在mod2.2.py中

    from . import mod2.1#方式1
    from .mod2.1 import *#方式2
    

      

       除此之外,还有隐晦相对路径(implicit relative path), 即不使用点号,让python自己相对路径查找。----这种方式不被推荐。

    同样是mod2.2.py中

    from mod2.1 import *#or
    import mod2.1
    

      

       相对路径不是很建议使用,参考这里。建议总是使用绝对路径

    mod2.2.py

    from Pkg.mod2.mod2.1 import *# or
    import Pkg.mod2.mod2.1 as some_short_sig
    

      

    什么时候你应该使用 from module import

    • 如果你要经常访问模块的属性和方法,且不想一遍又一遍地敲入模块名,使用 from module import
    • 如果你想要有选择地导入某些属性和方法,而不想要其它的,使用 from module import
    • 如果模块包含的属性和方法与你的某个模块同名,你必须使用 import module 来避免名字冲突。
    • 量少用 from module import * ,因为判定一个特殊的函数或属性是从哪来的有些困难,并且会造成调试和重构都更困难。
  • 相关阅读:
    [CSP-S模拟测试]:Merchant(二分答案)
    [CSP-S模拟测试]:回文(hash+二维前缀和)
    [CSP-S模拟测试]:排列组合(数学 or 找规律)
    [CSP-S模拟测试]:X国的军队(贪心)
    BZOJ3714 [PA2014]Kuglarz 【最小生成树】
    BZOJ3922 Karin的弹幕 【线段树】
    BZOJ3495 PA2010 Riddle 【2-sat】
    BZOJ2597 [Wc2007]剪刀石头布 【费用流】
    hdu6184 Counting Stars 【三元环计数】
    BZOJ4815 [CQOI2017]小Q的表格 【数论 + 分块】
  • 原文地址:https://www.cnblogs.com/Tommy-Yu/p/4206155.html
Copyright © 2011-2022 走看看