模块和包
一、模块部分
1、 import (引入)
导入一次,终身受益,不会重复导入。
语法:import + 模块|包
1)导入任意路径下的模块
自定义模块时,不能使用中文,也不能使用已使用的文件名,会被覆盖
把路径添加到系统环境变量path当中,
执行命令时,系统会自动按照路径找到模块,从而引入
如果找不到当前模块所在的路径,直接报错
将自定义绝对路径添加至sys.path中:
模块内容:
leader = "Lsir"
staff = "Zsir"
def task1():
taskone="{} asked {} to type a document".format(leader,staff)
print(taskone)
def task2():
tasktwo="{} asked {} to implement a functional module".format(leader,staff)
print(tasktwo)
class MyClass():
name = "yuemo"
添加环境变量:
import sys
sys.path.append("/Users/atsukokoshi/Desktop")
print(sys.path)
from Ctmmodule import task1
task1()
运行结果:
2)模块.变量
import sys
sys.path.append("/Users/atsukokoshi/Desktop")
import Ctmmodule
print(Ctmmodule.leader)
运行结果:
3)模块.函数
import sys
sys.path.append("/Users/atsukokoshi/Desktop")
import Ctmmodule
Ctmmodule.task1()
运行结果:
4)模块.类
import sys
sys.path.append("/Users/atsukokoshi/Desktop")
import Ctmmodule
print(Ctmmodule.MyClass().name)
运行结果:
2、from … import … (… 从…导入…)
1)导入单个
import sys
sys.path.append("/Users/atsukokoshi/Desktop")
from Ctmmodule import leader
print(leader)
运行结果:
2)导入多个
import sys
sys.path.append("/Users/atsukokoshi/Desktop")
from Ctmmodule import leader,task1
print(leader)
task1()
运行结果:
3)导入所有
“*” 通配符,代表所有
import sys
sys.path.append("/Users/atsukokoshi/Desktop")
from Ctmmodule import *
print(leader)
print(staff)
task1()
task2()
print(MyClass().name)
运行结果:
4)as 导入的同时,起别名
import sys
sys.path.append("/Users/atsukokoshi/Desktop")
from Ctmmodule import leader as ad
print(ad)
运行结果:
5)__all__可以设置*导入的范围
模块内容:
__all__ = ["leader","staff"]
leader = "Lsir"
staff = "Zsir"
def task1():
taskone="{} asked {} to type a document".format(leader,staff)
print(taskone)
def task2():
tasktwo="{} asked {} to implement a functional module".format(leader,staff)
print(tasktwo)
class MyClass():
name = "yuemo"
执行:
import sys
sys.path.append("/Users/atsukokoshi/Desktop")
from Ctmmodule import *
print(leader)
task1()
运行结果:
如图,报错task1未定义。
3、魔术属性的使用
返回模块名字的魔术属性 __name__
- 如果当前文件是直接运行的,返回__main__
- 如果当前文件是间接导入的,返回当前文件名(模块名)
文件直接被执行的时候返回__main__
- 当成模块被导入的时候,返回模块名本身;
模块内容:
leader = "Lsir"
staff = "Zsir"
def task1():
taskone="{} asked {} to type a document".format(leader,staff)
print(taskone)
def task2():
tasktwo="{} asked {} to implement a functional module".format(leader,staff)
print(tasktwo)
class MyClass():
name = "yuemo"
if __name__ == "__main__":
a = 1111
print(a)
从调用文件中获取__name__的值
import sys
sys.path.append("/Users/atsukokoshi/Desktop")
import Ctmmodule
print(Ctmmodule.__name__)
运行结果:
从模块中验证__name__的值:
模块内容:
leader = "Lsir"
staff = "Zsir"
def task1():
taskone="{} asked {} to type a document".format(leader,staff)
print(taskone)
def task2():
tasktwo="{} asked {} to implement a functional module".format(leader,staff)
print(tasktwo)
class MyClass():
name = "yuemo"
if __name__ == "__main__":
a = 1111
print(a)
print(__name__)
运行结果:
如果,后续我们在自己的模块中做测试时,需加入判断条件if name == “main”:,目的是调用方不会获取到我们自己的测试内容。
二、包部分
1、文件就是模块,目录(文件夹)就是包
2、__init__.py 是对包进行初始化的脚本文件,导入包的时候系统自动调用init文件,把init文件成员导入
3、可以通过__init__.py间接导入其他模块
1、导入包的使用
__init__内容:
cat = "毛线"
dog = "团团"
def animal():
print("I have two friends")
def func():
print("My cat {} and my dog {}".format(cat,dog))
执行:
import sys
sys.path.append("/Users/atsukokoshi/Desktop/学习记录/python31/")
import importpkg
print(importpkg.cat)
运行结果:
非init文件的执行:
方法一:
import sys
sys.path.append("/Users/atsukokoshi/Desktop/学习记录/python31/")
import importpkg.Ctmmodule
importpkg.Ctmmodule.task1()
运行结果:
方法二:通过初始化__init__文件间接导入Ctmmoudle模块
__init__内容:
from importpkg import Ctmmodule
cat = "毛线"
dog = "团团"
def animal():
print("I have two friends")
def func():
print("My cat {} and my dog {}".format(cat,dog))
执行:
import sys
sys.path.append("/Users/atsukokoshi/Desktop/学习记录/python31/")
import importpkg
importpkg.Ctmmodule.task1()
运行结果:
2、from … import … (从包导入相应成员)
从包当中导入成员属性(init):
import sys
sys.path.append("/Users/atsukokoshi/Desktop/学习记录/python31/")
from importpkg import func
func()
运行结果:
从包当中导入模块:
import sys
sys.path.append("/Users/atsukokoshi/Desktop/学习记录/python31/")
from importpkg import Ctmmodule
Ctmmodule.task2()
运行结果:
引入包下模块的具体成员:
import sys
sys.path.append("/Users/atsukokoshi/Desktop/学习记录/python31/")
from importpkg.Ctmmodule import task2
task2()
运行结果:
在引入的同时,起别名:
import sys
sys.path.append("/Users/atsukokoshi/Desktop/学习记录/python31/")
from importpkg.Ctmmodule import task1 as t1,task2 as t2
t1()
t2()
运行结果:
3、单入口模式
分模块不能单独进行调用,统一由主文件main进行调用
模块之间的互相嵌套导入,使用相对路径实现
单入口文件必须和包在同一层级,包里面可以含有各种包和文件
相对路径导入的落脚点在:模块或其中的具体成员身上
创建以下包路径:
main文件作文主文件,通过相对路径调用各包和模块
1). 代表当前
在test1中:
from . import pkg2_module1 as pg
print(pg.ceshi3000)
从主文件main中通过绝对路径导入test1:
from 单入口模式.get.second.third import test1
执行主文件:
成功取到pkg2_module1的值
注:在相对路径文件中无法获取到值,只能从主文件中获取!
2).. 代表上一级
test1文件:
from .. import Ctmmodule as ce
ce.task2()
主文件main执行:
from 单入口模式.get.second.third import test1
运行结果:
以此类推:
. 当前路径
… 上一级路径
… 上一级的上一级
… 上一级的上一级的上一级
… (这里的点是无限的)
from … import 模块