引用其他包或者模块的变量/函数的两种方式
1.引用包t模块c7中的变量a
方法1:
import t.c7
print(t.c7.a)
或者
import t.c7 as m
print(m.a)
直接使用import最细粒度只能导入模块,不能直接导入一个变量
例如 import t.c7.a
方法2:
from t.c7 import a
print(a)
这种方式import最细粒度可以导入变量,当然也可以导入模块,但是,这样没什么太大意义,和直接import模块没什么区别
2.导入t.c7模块内的所有变量
from t.c7 import *
print(a)
print(b)
print(c)
3.导入t.c7模块内指定的若干个变量
方法1:
在t.c7上方添加
__all__ = ['a','c']
然后在现模块内
from t.c7 import *
print(a)
print(c)
print(d)
点击运行,发现print(a)和print(c)都可以执行成功,print(d)报错,因为并没有导入t.c7的变量d,没有在all里标出的都不能被其他模块引用
方法2:
from t.c7 import a,c
print(a)
print(c)
如果引用的变量很多(python规范一行字符不要超过80个),可以使用反斜杠\换行或者把所有变量用小括号()括起来
from t.c7 import a,b,\
c,d,e,f
或者
from t.c7 import (a,b,
c,d,e,f)
推荐用第二种方式
4.init.py文件的作用
(1)当一个包被导入时(不论是导入的包还是导入的包内的模块),该文件会自动被执行
#编辑包t的__init__.py文件
a = 'This is __init__.py file'
print (a)
在另一个包的c2.py文件中引用包t
import t
运行,结果会输出
> python ./c2.py
This is __init__.py file
(2)可以在init.py文件里限制哪些模块可以被其他模块引用
如包t内有c1.py和c2.py两个模块
在t内的init.py中限定只能引用模块c1
__all__ = ['c1']
那么在另一个包的某模块中,只能引用c1模块内的变量和函数,不可以引用c2模块内的变量和函数
(3)当每一个模块都需要导入数十个相同的库时,在每一个模块都输入很多的import很麻烦
可以在包t内的init.py文件中包含所有的import
然后,现模块导入包t,就可以避免重复输入很多的import了
5.几点注意事项
(1)包和模块不会被重复导入,只会执行一次
(2)要避免循环导入:即两个模块互相导入或者多个模块的导入链形成了闭环,最终的结果是本模块运行必须要导入本模块,这样是无法执行的
(3)当引入一个模块,程序运行时,所引用模块内的所有语句都会执行一遍,例如print语句,这个要注意,尽量明确要导入哪个变量或者函数,尽量避免导入整个模块
网友评论