python中import 和 from import 的区别

python中import 和 from import 的区别:
一、两者用于模块时:
import 语句导入整个模块内的所有成员(包括变量、函数、类等)。

from import 只导入本语句指定的成员。当使用f rom xxx import * 导入模块时,与 import 等价。使用 from xxx import * 导入模块时,默认为导入模块中所有不以下划线开头的程序单元。
 但如果模块中有__all__变量时,再使用 from xxx import * 语句,则导入__all__中列出的程序单元。
 __all__用法示例:
 all = 列表

二、两者用于包时:
 import 只能导入包中__init__.py 文件中定义的程序单元。在__init__.py中未定义的程序单元如类、函数、变量等,则不能导入。
 当然,也可以使用 import 包名.模块名的方法导入__init__.py文件中未定义的程序单元,只是在使用这种方式导入的程序单元时,需要采用如下方法:
 包名.模块名.程序单元

from import 可以导入写在语句中的模块、子包、包、类、函数、变量以及在包的__init__.py 中已经导入的名字。

两者都可以用 as 给导入的名字重命名。

三、包导入的注意事项

1、不能在导入的路径中使用已经导入过的名字, 比如 import numpy as np; import np.random as rn, 这会报错, 说没有找到名字叫np的model, 这其实就说明python寻找包路径的时候, 是在文件系统中寻找, 而不包含当前命名空间中的名字, 即与当前的程序执行环境没有关系的
导入一个包时, 则这个包可用的属性都必须在__init__.py文件中定义, 这就是说如果一个包的__init__.py文件是空的, 则即使包里边有几个模块文件, 也无法通过这个包名去使用, 比如pkg下有a.py和b.py两个文件, 但是__init__.py中没有导入模块a和b,则import pkg as pg 后, 无法使用pg.a和pg.b,这个说明包内的模块和子包不会自动加入到包的名字空间里边, 需要手动通过__init__.py指定后才会加入。这一点上模块和包不太一样, 模块中的符号是自动导入的,因此可以直接通过模块名来调用。
  2、只是说无法通过pg这个名字来使用模块a和b, 但是我们可以手动导入a和b的, 用import pkg.a as a和from pkgs import a as a都是可以的。
  3、导入一个长串的路径时, 则这个路径上的所有包的__init__.py都会被执行, 并且包的对应子包也会被加入到包的属性中去, 比如我们现在有这样一个包结构: pkgs下有两个子包pkga和pkgb, 且pkgs/init.py是空文件,则import pkgs语句是无法使用pkgs.pkga这样的句子的, 但是如果我们后续又使用了一个import语句: import pkgs.pkga.a as a,则此时pkgs的名字空间里会加入pkga这个属性,也就是可以使用pkgs.pkga了
ps: from pkgs.pkga.a import fun_a这种长路径形式, 虽然会执行pkgs和pkga的__init__.py以及模块a的代码, 但是当前名字空间中并没有pkgs、pkga、a这些名字的,所以不能使用这些符号, 必须显示导入后才能使用。
  4、在__init__.py 或模块中已经导入的名字是属于这个包或者模块的, 他们的使用方式和模块中定义的符号是一样的, 比如在pkgs/init.py中有import tensorflow as tf, 则import pkgs后, 可以直接使用pkgs.tf来使用tensorflow, 又比如在模块a中有import numpy as np, 则import pgks.pkga.a as a后, 可以使用a.np来使用numpy。
  5、一个奇怪现象:就是在tensorflow下有python、core、tools等子包, 但是使用import tensorflow.python as pn和import tensorflow.core as ce会报错:AttributeError: module ‘tensorflow’ has no attribute ‘python’, 而 import tensorflow.tools as ts则没有出错, 并且很奇怪的是, 用from tensorflow import python 又是可以的, 正常来说from import和import的效果在这种情况下是一样的, 这里我猜是tensorflow对python和core的导入做了一些隐藏工作,因为这个异常是在tensorflow/python/util/deprecation_wrapper.py in getattr(self, name)中抛出的, 而且是一个AttributeError, 并不是python解释器自动抛出的ModuleNotFoundError,但是具体tf怎么实现的这个操作就没有去细究了
————————————————
说明:本文第三条主要参考以下内容(有修改):
版权声明:本文为CSDN博主「caixxiong」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_24406903/article/details/98725931

你可能感兴趣的:(python,开发语言)