2018年10月5日python相对引入和绝对引入详解

  • Post author:
  • Post category:python


|-direct

|-plane

|-__init__.py

|-modules.py

|-tools.py

|-tank

main.py

utils.py

main.py:

# 在自身文件夹下import 引入其他模块

import utils

# 引入其他包中的某个模块

import plane.tools

# 直接import的方式可以引入包,可以引入模块,最低级就是引入模块级别的文件,不能使用import方式直接导入模块中的变量,函数,类型,因为import方式它会把最后一个当成模块级别的文件来判断,结果就找不到这个对应的模块了,下面这种方式就是错误的方式


import plane.tools.hello_vars

使用import方式引入相应的模块之后,可以使用如下的方式操作引入的模块中的数据:

模块.变量

模块.函数

模块.类型

|-direct

|-main.py

|-utils.py

main.py:

# 直接引入的方式,

import utils

使用Import的方式寻找引入模块的路径是(所有绝对引入的查询路径):


1.


在当前文件夹,也就是direct(常用就是第一种)


2.


在环境变量PYTHONPATH指定的文件夹中的查询utils.py(很少去配置)


3.


在Python 解释器sys.path指定的文件夹中查询utils.py(很少去设置)

# 相对路径引入

from . import utils

print(utils.msg)

相对引入的方式没有错,但是如果直接运行的话就会报错:


ImportError: cannot import name ‘utils’

因为如果当前模块直接运行的话Python解释器就会认为当前模块就是顶层模块,是唯一一个,就不存在相对引入的说法了,所以如果文件中存在相对引入的话要想运行不报错,不能直接运行,必须给当前模块找一个文件中相对引入的参照物,例如在pycharm终端里面输入命令:      python -m direct.mian

就能正常运行了,因为文件中的相对引入方式的参照物就是direct这个文件夹。-m是指定的意思。

import直接引入和from x import …引入的区别就是Impot直接引入的方式可以引入包,可以引入模块,最低也要引入模块级别的文件,而用from x import…方式引入的话可以引入比较细致的的变量,函数,类型

|-direct

|-main.py

|-utils.py

main.py:

# 引入一个细致的变量/函数/类型

from .utils import msg

print(msg)

运行命令是在pycharm终端中输入: python -m direct.main

包和普通文件夹的区别:

包中一定要有一个__init__包声明文件

如何创建一个包:

可以在pycharm中右键->new->python package.

也可以先创建一个普通文件夹,然后在该文件夹中创建一个名为__init__.py的文件,那个这个普通文件夹就变成了一个包了

————————————————————————————————————————————-————————


相对引入和绝对引入

绝对导入的格式为 import A.B 或 from A import B

相对导入格式为 from . import B 或 from ..A import B,.代表当前模块,..代表上层模块,…代表上上层模块,依次类推)

相对引入的方式代码不能直接运行,会报错,前面有详解,必须给当前模块找一个文件中相对引入的参照物,例如在pycharm终端里面输入命令:      python -m direct.mian 才能正常运行

|-direct

|-plane

|-__init__.py

|- utils.py

main.py

main.py:

相对引入:


  1. 相对引入引入整个包,

    这个比较特殊,必须在包的__init__文件中定义其他文件引入该包要用到的东西。(个人理解:python对直接以相对方式引入整个包的这样方式不太赞同,因为如果包很大,里面内容很多的话就会拖慢引用者的运行速度,导致用户体验差,为了提高用户对pyhton的体验感,所以python 加了这样一个设置。可以理解!同时也给我们提醒,最好不要以相对的方式直接引入整个包,那样你还要在__init__.py中定义你要用到的该包中的哪些内容,比较麻烦,还不如你直接引用的时候就指定使用包中的哪个模块或者哪个模块的哪个变量/函数/类型,还方便还不需要在包的__init__.py文件中定义任何东西)


使用相对引入的方式直接引入包plane的话引入的是该包声明文件__init__.py中的代码,所以要在__init__中定义你要使用的这个包的哪些数据。

main.py:

from . import plane

print(plane.name)

print(plane.utils.msg)

备注:


切记不要在包声明文件__init__.py中没有定义任何代码的情况下,通过包名称操作包中的模块代码,那样会报错,报错图片如下,一定要先在引入的包的__init__.py声明文件中定义你要进行的包模块操作,相对方式引入的包才能正常工作。

下面两种相对引入方式不需要在包的__init__中定义任何东西就可以使用引入的包内的数据,在pycharm终端中使用命令 : python -m direct.main运行


  1. 相对引入引入包中的模块

引入包内的模块不能使用

from . import plane.utils

, 这样后半部分会报错,要把包名称写在前面,如:

from .plane import utils

print(utils.msg)


  1. 相对引入引入包中的模块中的具体代码方法/函数/类型

from .plane.utils import func

func()

——————————————————————————————————————————————————————

绝对引入:

main.py:


  1. 最直接的绝对引入整个包

    (但是同样引入整个包和相对引入整个包一样需要在该包的__init__.py中定义要使用包中的哪些数据,后边才能正常使用引入的包,否则会报错找不到包下的那个模块

    )。

import plane

print(plane.utils.msg)

绝对方式引入包中的模块或者具体数据就不需要在该包的__init__.py声明文件定义任何东西就可以使用包中的数据


  1. 绝对引入的方式引入包中的模块

from plane import utils


3.


绝对引入的方式引入包中的模块的具体数据

from plane.utils import msg

print(utils.msg)

print(msg)

——————————————————————————————————————————————————

无论是相对引入和绝对引入,使用from a import b的最后的位置都是只有一个模块名或者具体数据名,如果有多个前缀都要放到前边的from中。

可以给引入的名称比较长的模块路径起一个别名,例如:

import plane.utils as pu

还有一种引入的方式,模糊引入:

from 包名称 import *

这是一个语法糖,慎重使用

如果项目中需要引入的包文件不多的话, 可以参考使用

如果项目中需要引入的包文件非常庞大,不要使用模糊引入,会严重消耗系统资源

同时使用模糊引入的话需要在引入的包中的声明文件__init__中定义*所包括本包下的哪些模块。这时有一个模块定义属性: __all__, 值是一个列表,表示通过模糊引入方式直接导入all中定义的所有模块,是写在包的__init__声明文件中的,例如:

__all__ = [“utils”, “modules”, “tools”], 意思就是通过模糊引入的方式,直接可以引入包中的哪些模块,直接定义在__all__中就可以了

集成

开发环境





IDE



,Integrated Development Environment )是用于提供程序开发环境的应用程序也就是程序开发工具。

IDLE 是一个纯 Python 下自带的简洁的集成开发环境(IDE) [1]


——————————————————————————————————————————————————————

小总结

1. 模块和包

模块:python中每个python文件都是一个独立的模块

较少的、独立的、功能近似的 多个变量、函数、类型的集合!

包:包含多个python模块的文件夹,包含一个特殊的__init__.py声明文件

包含多个模块,具备强大功能的程序!

包 & 文件夹 区别

包:包含了一个__init__.py声明文件[空文件、编写代码]

文件夹:普通文件夹

区别1:包可以更加有效的管理python模块,文件夹只能作为默认包进行基本管理[包含文件]!

区别2:包和文件夹中引入对应的模块代码的操作方式区别!

2. import & from import

包和模块的引入

(1) import

#引入一个模块

import 模块名称

#使用模块中的数据

模块名称.变量名称

模块名称.函数名称

模块名称.类型名称

# 引入一个包

import 包名称

# 使用包中的数据

包名称.模块名称.变量名称/函数名称/类型名称

# 引入包中的某个模块

import 包名称.模块名称

# 使用包中的数据

包名称.模块名称.变量名称/函数名称/类型名称

# ERROR:引入包中的某个变量

import 包名称.模块名称.变量名称

(2) from import语法

# (相对)引入包

from . import 包名称  [必须在__init__.py中,主动通过from . import引入需要的模块]

# 使用数据

包名称.模块名称.变量名称/函数名称/类型名称

# (相对)引入包中的模块

from .包名称 import 模块名称

# 使用数据

模块名称.变量名称/函数名称/类型名称

# (相对) 引入包中的模块中的数据

from .包名称.模块名称 import  变量/函数/类型

# 使用数据:当成当前文件中的数据进行数据

变量名称/函数名称/类型名称

3. 相对引入 & 绝对引入

相对引入:相对当前文件路径,参照父级文件路径

|– demo/

|– utils.py

|– main.py  [from . import utils]

运行:添加参照路径:python -m demo.main

运行过程中,在main.py中找到相对路径的utils.py

绝对引入:针对包/项目/模块,直接引入的方式

|– demo/

|– users/

|– __init__.py

|– tools.py

|– utils.py

|- main.py

[import utils]

[from users import tools]

[绝对引入:查询路径]

[当前文件夹|PYTHONPATH|sys.path]



版权声明:本文为qq_40994972原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。