zoukankan      html  css  js  c++  java
  • python 的 import 使用规则

    对于含有 __init__.py 的目录(如adir),其实它就是一个package,它的子目录如果也包含 __init__.py,则只要将 adir 加入 sys.path,则它的字目录就不用加了,python在import的时候会自动遍历所有含有 __init__.py 的子目录。

    python文件的引入有2中方式:1、作为顶层执行脚本(执行入口)而加载;2、作为模块被引入。如果你直接执行一个python文件,则它就被当作顶层执行脚本而被加载。如果你使用参数-m (python -m file.py),则该文件被当作模块被引入,  如果该文件被其它文件以import的方式引入,则它也会被当成模块。一个文件的引入方式只能是这两种中的一种,而且某时刻只能是其中一种。

    介绍了import,就必须介绍python的naming:

    当文件被装载之后,它就会在装载器中获得一个唯一的命名,变量叫做 __name__。如果文件作为顶层执行脚本被引入,则 __name__ == "__main__"。如果作为module被引入,则 __name__ 就是文件的文件名加上一些前缀,这些前缀就是packages/subpackages这样的类似文件路径的东西,不过是由点号dot隔开,而不是/隔开。注意其中的“类似”两字,表明前缀和文件路径不完全一样。比如:

    package/
            __init__.py
            subpackage1/
                    __init__.py
                    moduleX.py
            moduleA.py

    如果你引入(即作为模块被引入) moduleX,则它的 __name__ 就是 package.subpackage1.moduleX,如果你引入moduleA,则它的 __name__ 就是package.moduleA。但是如果你直接执行moduleX,则它的 __name__就是 "__main__",如果你直接执行moduleA,它的名字就变成了 "__main__",模块名 package.moduleA 自动被舍弃。

    作为模块引入的时候,__name__ 属性是随引入的方式而不同的。一般有2种方式:被同级目录里的其它文件引用,或经由package而被引用。以上面例子为例,如果被同级目录里的文件引用,则moduleX的 __name__ 属性为 "moduleX",而不是 "package.subpackage1.moduleX"。因为python会将当前目录自动加入search path,它并不知道自己所在的目录是否属于某packge。一个特例是,如果你使用的是交互式python命令行,则该命令行的session的 __name__ 属性为 "__main__"

    因此,综上所述,你引入一个module的方式(经由同级目录里的其它文件引用,或经由package引用,也即 __name__ 属性的值)是你能否将一个文件module成功引入的关键。

    相对引入:

    由于python为了保证package作为一个独立的模块,即将它拷贝到别处也不依赖于模块外部的东西而能马上运行,因此相对引入不允许引入package外的任何东西。

    因此,相对引入有一下规则:

    相对引入是使用module的 __name__ 属性来判定它是否属于一个package或在某package的位置。如果你使用相对引入如 from .. import foo,则这里的 .. 是告诉python从当前目录开始反向搜索本package去搜索 foo 模块(向本package的顶层回溯两个dot)。以上面的例子为例,如果当前模块的 __name__ 是 package.subpackage1.moduleX,则 ..moduleA 就意味着将找到 package.moduleA。为了 .. import 正确工作,模块的 __name__ 必须拥有相应个数的dot,如 package.subpackage1.moduleX 模块,向左数两个dot,则是package模块

    如果你当前module的 __name__ 是 "__main__",则python会认为该module不在任何package中(即便它在),因为__name__中不包含dot,因此你无法在其文件中使用 .. import,也即无法使用 相对引入,否则你会得到"relative-import in non-package" 错误提示。

     

     

  • 相关阅读:
    编程之道——高内聚低耦合
    虚拟机的安装
    Tomcat的安装与配置
    Spring(十)--Advisor顾问
    Spring(九)--通知
    Spring(八)-- 代理设计模式
    Spring(七)--Spring JDBC
    Spring(六)--Spring配置文件之间的关系
    Spring(五)--autowire自动装配和spel
    Spring(四)--bean的属性赋值
  • 原文地址:https://www.cnblogs.com/welhzh/p/7372576.html
Copyright © 2011-2022 走看看