#foo.py __all__=['x','get'] #该列表中所有的元素必须是字符串类型,每个元素对应foo.py中的一个名字 x=1 defget(): print(x) defchange(): global x x=0 classFoo: deffunc(self): print('from the func') 这样我们在另外一个文件中使用*导入时,就只能导入__all__定义的名字了
from foo import * #此时的*只代表x和get
x #可用 get() #可用 change() #不可用 Foo() #不可用
其他导入语法(as)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
我们还可以在当前位置为导入的模块起一个别名
import foo as f #为导入的模块foo在当前位置起别名f,以后再使用时就用这个别名f f.x f.get() 还可以为导入的一个名字起别名
from foo import get as get_x get_x() 通常在被导入的名字过长时采用起别名的方式来精简代码,另外为被导入的名字起别名可以很好地避免与当前名字发生冲突,还有很重要的一点就是:可以保持调用方式的一致性,例如我们有两个模块json和pickle同时实现了load方法,作用是从一个打开的文件中解析出结构化的数据,但解析的格式不同,可以用下述代码有选择性地加载不同的模块
if data_format == 'json': import json as serialize #如果数据格式是json,那么导入json模块并命名为serialize elif data_format == 'pickle': import pickle as serialize #如果数据格式是pickle,那么导入pickle模块并命名为serialize
#1、执行run.py会抛出异常 正在导入m1 正在导入m2 Traceback (most recent call last): File "/Users/linhaifeng/PycharmProjects/pro01/1 aaaa练习目录/aa.py", line 1, in <module> import m1 File "/Users/linhaifeng/PycharmProjects/pro01/1 aaaa练习目录/m1.py", line 2, in <module> from m2 import y File "/Users/linhaifeng/PycharmProjects/pro01/1 aaaa练习目录/m2.py", line 2, in <module> from m1 import x ImportError: cannot import name 'x'
#1、执行文件不等于导入文件,比如执行m1.py不等于导入了m1 直接执行m1.py抛出异常 正在导入m1 正在导入m2 正在导入m1 Traceback (most recent call last): File "/Users/linhaifeng/PycharmProjects/pro01/1 aaaa练习目录/m1.py", line 2, in <module> from m2 import y File "/Users/linhaifeng/PycharmProjects/pro01/1 aaaa练习目录/m2.py", line 2, in <module> from m1 import x File "/Users/linhaifeng/PycharmProjects/pro01/1 aaaa练习目录/m1.py", line 2, in <module> from m2 import y ImportError: cannot import name 'y'