模块:实际是一个py文件
包:指目录,目录里面包含__init__.py,内容可以是空,里面还可以包含其他的py文件。
子包:包里面再创建的包
模块的导入
我们写代码的时候,实际上可以把所有的代码都包含在一个文件里面。
需要把一个很大的文件,拆分为不同的模块或者包,以此来实现代码的可维护性
模块和包,可以很方便的提供给其他程序以复用。在构建工程的时候,还可以基于模块和包来进行开发人员的任务分配工作。
import:导入一个整体的模块
from:从一个模块中获取一些特定的内容
reload:在不终止python程序的情况下,重新导入模块文件内容的方法。
a.py
import b print(b.x) b.print_sth() y=b.Person() print(y)
b.py
x=100 def print_sth(): print("gloryroad!") class Person(object): pass
注意:a.py和b.py要在同一个目录下
执行结果:
C:\Users\dell>py -3 D:\python\a.py
100
gloryroad!
<b.Person object at 0x000002187C186B70>
b.py
x=100 def print_sth(): print("gloryroad!") class Person(object): pass print("hi!")
执行结果:
C:\Users\dell>py -3 D:\python\a.py
hi!
100
gloryroad!
<b.Person object at 0x000001EDAA3B6B70>
结论:b.py中所有的内容在导入的时候都会被执行,所以执行a.py时hi!也被输出了
如果不想让打印语句(测试代码)在a中执行时要写的if __name__ == "__main__"里
b.py
x=100 def print_sth(): print("gloryroad!") class Person(object): pass #此语句表示,当本文件被当做程序执行的时候 #才会执行此语句下面的代码。 #如果本文件被其他文件import,那么if代码块 #则不会被执行 if __name__ == "__main__": print("hi!元宵节快乐!")
执行结果:
C:\Users\dell>py -3 D:\python\a.py
100
gloryroad!
<b.Person object at 0x000001E082516B70>
结果:在执行a.py的时候if里面的语句没有被执行
引入模块的两种写法:
一 、import xxx 这种写法a.py想要使用b.py中的函数/方法/变量时前面需要加模块的名字(b.XXX),写法比较麻烦
二、 from xxx import a,b,c(按变量或函数来引入) / from xxx import *(如果b.py中函数,变量等太多可以用*,*表示引入所有,但容易冲突)
示例:
a.py
from b import x,print_sth,Person print(x) print_sth() y=Person() print(y)
#b.py实际上是一个python文件,它是一个模块;模块给其他程序文件提供公用的变量、函数和类
#a.py实际上是主程序,引用b模块(b.py)来做一些事情
命名冲突:a,b都存在xx
a.py
from b import * xx=123 print(xx) print(b.xx)#这样写会报错
b.py
xx=100
运行结果:#报错,b未定义
D:\pic\test2>py -3 a.py
123
Traceback (most recent call last):
File "a.py", line 5, in <module>
print(b.xx)
NameError: name 'b' is not defined
修改a.py
from b import * import b xx=123 print(xx) print(b.xx)
执行结果:
D:\pic\test2>py -3 a.py
123
100
命名空间:
a.py和a.py中有相同的变量(冲突)
a.py的命名空间:
xx
b.py的命名空间:
x
print_sth
Person
xx
import b
我把b的命名空间引入到了a.py文件
b.x
b.print_sth
b.Person
优点:a和b的命名空间的内容不会冲突
因为b.xxxx肯定不会和a文件中的变量、函数和类的命名相冲突
from b import *
把b的命名空间引入到了a.py文件,并且使用的时候无须加上b.
x
print_sth
Person
优点:省去写b.
缺点:容易产生冲突
例如:
b.py包含xx
a.py也包含xx
则此时a.py中print(xx),会使用a.py中的xx值。
实例:
a.py
from b import * import b xx=123 print(xx) print(b.xx)
b.py
x=100 def print_sth(): print("gloryroad!") class Person(object): pass xx=1000 if __name__ == "__main__": print("hi!元宵节快乐!")
执行结果:
C:\Users\dell>py -3 D:\python\a.py
123
1000
包的导入
包:包含目录---目录下要包含模块和__init__.py
包下面可以包含多个模块,还可以包含子包
创建一个D:\packagea的包
#包和a.py必须在同级目录
a.py
import packagea.c print(packagea.c.yy) packagea.c.p() g=packagea.c.P() print(g)
c.py
yy=123 def p(): print("hello!") class P(object): pass
运行结果:
C:\Users\dell>py -3 D:\python\a.py
123
hello!
<packagea.c.P object at 0x000001F044236B70>
另一种导入包下面的模块的写法:
a.py
from packagea.c import * print(yy) p() g=P() print(g)
运行结果:
C:\Users\dell>py -3 D:\python\a.py
123
hello!
<packagea.c.P object at 0x0000021D5B786B70>
创建子包:D:\packagea\subpackage
子包下创建一个:d.py文件
a.py
#第一种导入的写法 from packagea.subpackage.d import * print(mm) #第二种导入的写法 import packagea.subpackage.d print(packagea.subpackage.d.mm)
d.py
mm=125
运行结果:
C:\Users\dell>py -3 D:\python\a.py
125
#不在同一级目录时
#方法1:主程序和依赖的包或依赖的模块在同一级。
#方法2:只是程序执行时候有效
#import sys
#print(sys.path)
#sys.path.append(包的绝对路径或者模块的绝对路径)
#方法3:
#通过我的电脑的设置,把将包或者模块的路径加到pythonpath变量下
#需要重启cmd
#方法4:
将包或者模块直接放到C:\Python36\Lib\site-packages目录下即可
a.py
import sys sys.path.append(r"D:\packagea\subpackage") from packagea.subpackage.d import * print(mm)