学习内容
- 模块
- __all__方法
- 包
- 包中__init__.py的使用
模块
什么是模块:
只要以.py为后缀的文件,都可以被称为模块
模块中可以包含什么东西
1、变量
2、函数
3、面向对象(类->对象)
4、可执行代码
使用模块有什么好处
管理方便,易维护
降低复杂度
PI = 3.14
def get_area(r):
return PI * r ** 2
class Student():
def __init__(self,name,age):
self.name = name
self.age = age
def show_info(self):
print('name:{0},age:{1}'.format(self.name,self.age))
print(PI)
print('半径为2的圆的面积为:{0}'.format(get_area(2)))
stu = Student('James',20)
stu.show_info()
如何使用模块:
自定义模块
导入模块:
1、import 模块名1,模块名2。。。。
导入之后如何使用?
模块名.函数名(参数)
模块名.类
模块名.变量
2、导入模块中相关的数据
from 模块 import 变量,函数,类
导入之后如何使用?
可以直接使用
#1、导入模块的方式
import random
result = random.randint(1,6)
print(result)
#2、导入模块中相关数据的方式
from random import randint
result = randint(1,6)
print(result)
自定义一个模块
实现数学的四则运算
两个数的加减乘除运算
def add(a,b):
#加法运算
#return:两个数的和
return a + b
def sub(a,b):
return a - b
def mul(a,b):
return a * b
def div(a,b):
return a / b
if __name__ == '__main__':
a = 10
b = 2
print('和:{0}'.format(add(a,b)))
print('差:{0}'.format(sub(a,b)))
print('积:{0}'.format(mul(a,b)))
print('商:{0}'.format(div(a,b)))
#__main__
print(__name__)
导入自定义模块
1、import 模块
问题: 在导入模块的时候,模块的代码会执行一遍
解决方案:
在自定义模块中:
新增控制代码:
if name == ‘main’:
测试代码执行
2、from 模块 import 函数。。。
import MyMath
x = 10
y = 20
print('和:{0}'.format(MyMath.add(x, y)))
from MyMath import add
print('和为:{0}'.format(add(x,y)))
__all__方法
使用自定义模块的时候:
1、import 模块
2、from 模块 import 变量,类,函数。。。。
问题:如果要使用这种方案导入模块中的所有功能,一个一个填写,比较麻烦
解决方案:
from 模块 import *
* 默认导入模块中所有功能
如果在模块中手动添加全局变量__all__ = []
手动添加全局变量__all__之后,from 模块 import *将不再是默认导入所有功能,
而是导入__all__列表中的功能(python3中不提倡使用)
__all__ = ['add','sub','mul','div']
def add(a,b):
#加法运算
#return:两个数的和
return a + b
def sub(a,b):
return a - b
def mul(a,b):
return a * b
def div(a,b):
return a / b
if __name__ == '__main__':
a = 10
b = 2
print('和:{0}'.format(add(a,b)))
print('差:{0}'.format(sub(a,b)))
print('积:{0}'.format(mul(a,b)))
print('商:{0}'.format(div(a,b)))
#__main__
print(__name__)
from MyMath import *
result = add(10,20)
print(result)
result = sub(10,20)
print(result)
result = mul(10,20)
print(result)
result = div(10,20)
print(result)
包
包的概念:
可以理解为文件夹,前提是文件中包含一个__init__.py
包的作用:
1、将模块归类方便整理
2、防止模块名冲突
模块中的包,名字会产生变化
新的名字:
包名.模块名
Mymath
package1.MyMath
包中的模块如何使用:
1、import 模块
2、from 模块 import 变量,函数,类
# import MyMath
# result = MyMath.add(10,20)
# import package1.MyMath
# result = package1.MyMath.add(10,20)
# print(result)
from package1.MyMath import *
result = add(10,20)
print(result)
result = sub(20,10)
print(result)
包中__init__.py的使用
package
init.py
类中__init__是初始化方法
包中的__init__.py是初始化模块
初始化
首次使用包中的模块时,__init__.py中到的模块会被执行一次
init.py中可以存放什么?
可以存放同普通模块一样的代码
变量,类,函数。。。都是ok的
一般会写一些辅助代码:
让你更方便的使用模块
在测试文件中
import 包
在包的__init__.py中导入
import 模块
这种方式等价于:在测试文件中 使用 import 包.模块名
-------------------------
在测试文件中
from 包 import *
在__init__.py中
from .模块 import *
这种方式等价于: 在测试文件中 使用 from 包.模块名 import *
# import package1.MyMath
# import package1
# # import package1.MyMath
# result = package1.MyMath.add(10,20)
# print(result)
# from package1.MyMath import *
from package1 import *
result = add(10,20)
print(result)
init.py中的内容
# print('我是package1中的__init__方法')
# import MyMath
#导入模块中的类容
from .MyMath import *