学习内容

  • 模块
  • __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 *