文章目录
模块
一个模块就是一个包含python代码的文件。一个文件就是一个模块
mymodule.py
#声明一个模块
#变量
girls = 3
boys = 29
boss = 'beautilful boys!'
#函数
def sing():
print('如果你是小叮当没那么我是谁?')
def study():
print('学习各种天文地理生物化学,青春期生理保健~')
#类
class ZhangWang:
#属性
sex = '男'
age = 28
name = '四处张望'
#方法
def sleep(self):
print('...zzzZZZZZ')
def eat(self):
print('爱吃大西瓜~')
#模块书写完毕 为了检测模块内容的可靠性 经常加入测试代码( 被别人导入时不能执行的)
if __name__ == '__main__':
print(boss)
sing()
为什么要使用模块
1.现在程序开发文件比较大,都放在一个文件中维护不方便,拆分成多个文件方便维护与管理
2.模块可以增加代码的重用率
3.模块可以当作命名空间
如何定义自己的模块
模块本身就是一个文件,所有py代码都可以在文件中直接书写。不过我们开发共用模块时,最好在模块中书写以下内容。
变量 模块中的属性值
函数 单独的功能
类 相似功能组合
模块测试代码 临时使用,被导入时不会执行
测试代码:
测试代码经常在开发模块时用于测试模块的功能,但是测试代码仅在开发和测试时使用,被当作模块导入时不希望测试代码运行。需要使用name特殊变量来操作。
if __name__ == '__main__':
#测试代码区域(仅在吧当前文件直接运行时才会执行测试代码,当作模块导入时则不会执行)
__name__ 在直接运行当前文件时,结果为__main__
__name__ 被当作模块导入文件时,结果为 模块名称
模块的导入方式
import 模块名
作用:直接导入模块
使用方法:
模块名.变量名
模块名.函数名
模块名.类名.方法名()
模块名.类名.属性名
import mymodule
#模块中的变量
print(mymodule.girls)
print(mymodule.boys)
#模块中的函数
mymodule.sing()
#模块中的类
print(mymodule.ZhangWang.age)
mymodule.ZhangWang.sleep(1)
import 模块 as 别名
作用:直接导入模块,并且为模块起一个别名
使用方法:
别名.变量名
别名.函数名
别名.类名.方法名()
别名.类名.属性名
import mymodule as mm
#变量
print(mm.boys)
print(mm.girls)
print(mm.boss)
#函数
mm.sing()
#类
mm.ZhangWang.eat(1)
from 模块 import 某个函数或者类
作用:直接导入模块中的某个方法或者某个类或变量
使用方法:
函数名()
变量名
类名.方法名()
属性名
from 模块 import 函数,函数,类,类…
作用:直接导入模块中的多个方法和多个类和变量
使用方法:
函数名()
变量名
类名.方法名()
属性名
from 模块 import *
作用:直接导入模块中的所有方法和类和变量
使用方法:
函数名()
变量名
类名.方法名()
属性名
**注意事项:**如果采用from 导入的方式要确保模块中的函数变量等内容不能与系统的内置函数同名,否则会出现异常。
''''''
'''
#丛模块中导入制定一个内容
from mymodule import sing
#调用函数sing (q其他都不用)
sing()
#因为导入时制定了sing导入,其他都不能使用
print(mymodule.boss)
'''
#丛模块中导入制定个数的内容
from mymodule import sing,boss,girls
#调用函数sing (其他都不用)
sing()
#变量boss和girls
print(boss)
print(girls)
print(boys)
'''
#导入模块中所有内容
from mymodule import *
#调用函数sing (q其他都不用)
sing()
#变量boss和girls
print(boss)
print(girls)
print(boys)
#类
print(ZhangWang.sex)
ZhangWang.sleep(1)
'''
模块的存放
如果不想自己新建自定义的模块文件夹,可以将我们自定义的模块存放到 python 目录中的\Lib\site-packages中。
搜索路径就是python在加载模块时候的查找路径
1.获取当前模块的搜索路径
import sys
sys.path 获取当前搜索路径的列表
2.将自定义的路径添加到列表中
sys.path.append(自定义路径)
模块的加载顺序
导入模块操作的步骤:
1.检测内存中是否已经加载过当前模块,如果加载过,直接使用加载的模块
2.如果内存中没有加载当前模块,则搜索python的内置模块
3.如果当前内置模块中中没有该模块,根据搜索路径查找并且加载模块
包
包就是文件夹,他用于存放文件也就是模块。包中也可以存放包
包的结构
包
|---- __init__.py 包的标志文件
|---- 模块1
|---- 模块2
|---- 子包(文件夹)
|-----|----__init__.py
|---- |----子模块1
|---- |----子模块2
包的导入和使用
import 包.模块
使用方法:
包.模块.变量名
包.模块.函数名()
包.模块.类名.属性名
包.模块.类名.方法名()
./mypack/cat.py
#定义猫的模块
sex = '雄'
age = 2
def jiao():
print('喵喵~~姥姥~~')
class ZhuaLaoShu:
#属性
tool = '爪子'
#方法
def pu():
print('小子,看你往哪里炮~!')
#导入包中的模块
import mypack.cat
#变量
print(mypack.cat.sex)
print(mypack.cat.age)
#函数
mypack.cat.jiao()
#类
print(mypack.cat.ZhuaLaoShu.tool)
mypack.cat.ZhuaLaoShu.pu()
import 包.模块 as 别名
使用方法:
别名.变量名
别名.函数名()
别名.类名.属性名
别名.类名.方法名()
#导入包中的模块
import mypack.cat as c
#变量
print(c.sex)
print(c.age)
#函数
c.jiao()
#类
print(c.ZhuaLaoShu.tool)
c.ZhuaLaoShu.pu()
from 包.模块 import 函数或者类或者属性
使用方法:
变量名
函数名()
类名.属性名
类名.方法名()
from 包.模块 import *
使用方法:
变量名
函数名()
类名.属性名
类名.方法名()
./mypack/dog.py
# 定义狗的模块
sex = '磁性'
age = 12
def jiao():
print('汪汪~~汪汪~~呜~~')
class ChiShi:
# 属性
tool = '嘴巴'
# 方法
def tian():
print('香甜软糯,口感棒棒哒!~~')
#使用from 。。import语法
'''
from mypack.dog import sex
# 变量
print(sex)
#只要没有导入就不可以使用!
print(mypack.dog.age)
from mypack.dog import sex,age
# 变量
print(sex)
print(age)
#只要没有导入就不可以使用!
mypack.dog.jiao()
'''
from mypack.dog import *
# 变量
print(sex)
print(age)
#函数
jiao()
#类
print(ChiShi.tool)
ChiShi.tian()
在__init__.py文件中添加内容(当模块用)
在此情况下可以将包当作模块直接导入使用
import 包
使用:
包.变量名
包.函数名()
包.类名.属性名
包.类名.方法名()
./yourpack/__init__.py
#给init文件添加内容 就相当于给包添加内容 包可以被导入使用
#变量
dinner = '抄手!'
feel = '清汤 大份'
#方法
def zhu():
print('咕嘟咕嘟~~')
#直接导入包(将包当作模块)
'''
import yourpack
print(yourpack.dinner)
print(yourpack.feel)
yourpack.zhu()
'''
'''
import yourpack as y
print(y.dinner)
print(y.feel)
y.zhu()
'''
from yourpack import *
print(dinner)
print(feel)
zhu()
import 包 as 别名
使用:
别名.变量名
别名.函数名()
别名.类名.属性名
别名.类名.方法名()
from 包 import 函数,类,变量
使用:
变量名
函数名()
类名.属性名
类名.方法名()
from 包 import *
使用:
变量名
函数名()
类名.属性名
类名.方法名()
./hispack/__init__.py
#设置一个固定变量
#__all__ 作用设定使用from import 语法直接导入制定的模块
__all__ = ['child','man','woman']
./hispack/child.py
name = '大头儿子'
./hispack/man.py
name = '小头爸爸'
./hispack/women.py
name = '围裙妈妈'
#必须使用该语法 __all__才会生效
from hispack import *
#使用child的内容
print(child.name)
#使用man的内容
print(man.name)
#使用woman的内容
print(woman.name)
包和模块的互相调用问题
如果在当前模块中需要调用其他模块或者包的内容时,可以直接使用import 导入对应的包和模块,就可以加载进来使用,import 会搜索包和模块对应的搜索路径(sys.path)
import 模块或者包
./itpack/__init__.py
#空
./itpack/cat.py
#在cat中导入fish模块中的内容(cat和fish是平级)
#import itpack.fish#方法1: 外部调用itpack中的cat是可以正常使用,内部不行
#import fish #方法2: 内部调用cat可以正常使用,外部不行
name = '我是一只可爱的小猫咪'
def hobby():
print('我的爱好是吃鱼')
#print(itpack.fish.name)#方法1
#print(fish.name)#方法2
#测试代码
if __name__ == '__main__':
hobby()
./itpack/fish.py
name = '我是一条可爱的大鲨鱼!'
import itpack.cat
#调用cat的爱好
itpack.cat.hobby()
./herpack/__init__.py
#空
./herpack/boys.py
#改变(添加)搜索路径[仅仅为当前文件添加]
import sys
#print(sys.path)
sys.path.append('..')#让代码找到herpack包
#print(sys.path)
import herpack.girls
name = '章旺'
def love():
print('我喜欢一个姑娘,他就是')
#打印girls中的name
print(herpack.girls.name)
#测试代码
if __name__ == '__main__':
love()
./herpack/girls.py
name = '史珍香'
#直接导入boys文件
import herpack.boys as b
#调用love
b.love()
__all__特殊变量的用法
- 在__init__.py文件中,如果没有__all__变量,那么使用from 包 import * 仅导入__init__.py中定义的方法和类及其他内容
- 在__init__.py文件中,如果定义__all__变量,那么使用from 包 import * 则会导入__all__指定的所有模块,而忽略__init__.py文件中的信息
__all__ = ['模块','模块','子包'。。。] #必须是列表
./person/__init__.py
name = '秃大哥'
age = 18
sex = '男'
./person/man.py
#表示直接导入init文件的中的内容(表示当前文件所在的文件夹中的__Init__文件)
from . import *
print(sex)
import person.man