python学习笔记之---模块、包

模块:实际是一个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:Usersdell>py -3 D:pythona.py
100
gloryroad!
<b.Person object at 0x000002187C186B70>
 
 
 
b.py
x=100
 
def print_sth():
    print("gloryroad!")
 
class Person(object):
    pass
 
print("hi!")

执行结果:

C:Usersdell>py -3 D:pythona.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:Usersdell>py -3 D:pythona.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 est2>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 est2>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:Usersdell>py -3 D:pythona.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:Usersdell>py -3 D:pythona.py
123
hello!
<packagea.c.P object at 0x000001F044236B70>
 
 
 
另一种导入包下面的模块的写法:
a.py
from packagea.c import *
 
print(yy)
p()
g=P()
print(g)

运行结果:

C:Usersdell>py -3 D:pythona.py
123
hello!
<packagea.c.P object at 0x0000021D5B786B70>
 
 
 
创建子包:D:packageasubpackage
子包下创建一个: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:Usersdell>py -3 D:pythona.py
125
 
 
 
#不在同一级目录时
#方法1:主程序和依赖的包或依赖的模块在同一级。
#方法2:只是程序执行时候有效
#import sys
#print(sys.path)
#sys.path.append(包的绝对路径或者模块的绝对路径)
#方法3:
#通过我的电脑的设置,把将包或者模块的路径加到pythonpath变量下
#需要重启cmd
#方法4:
将包或者模块直接放到C:Python36Libsite-packages目录下即可
 
a.py
import sys
sys.path.append(r"D:packageasubpackage")
 
from packagea.subpackage.d import *
 
print(mm)
 
原文地址:https://www.cnblogs.com/wenm1128/p/11657391.html