一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天
模块
了解模块
模块就是代码组织的一种方式,将功能相近的函数或者类放到一个文件中
- 优点
- 提高代码的可用性,可维护性。一个模块编写完毕后,可以很方便的在其他项目中导入
- 解决命名冲突,不同模块的相同命名不会冲突
常用标准库
| 标准库 | 说明 |
|---|---|
| builtins | 内置函数默认加载 |
| math | 数学库 |
| random | 随机数 |
| os | 文件操作 |
| re | 字符串正则匹配 |
| copy | 拷贝 |
| sys | Python自身的运行环境 |
| json | 编码和解码 json对象 |
| logging | 记录日志,调试 |
| functools | 常用工具 |
| threading | 多线程 |
| multiprocessing | 多进程 |
| hashlib | 加密算法 |
| datetime | 日期和时间 |
自定义模块
- 我们来自定义创建一个加减运算的模块
- 定义加减运算的函数
#变量
number = 100
name = 'sum_sub'
#函数
def add(*args):
if len(args) > 1:
sum = 0
for i in args:
sum += i
return sum
else:
print('请输入两个及以上的数')
def sub(*args):
if len(args) > 1:
result = 0
for i in args:
result -= i
return result
else:
print('请输入两个及以上的数')
#类
class Sumsub:
def __init__(self,num):
self.num = num
def test(self):
print('正在使用sun_sub模块运算')
- 将上述的函数放到名为sum_sub.py的文件当中即可完成一个模块的定义
- 那么我们这个时候怎么调用呢?
导入模块方式1
import 模块名
import sum_sub
使用模块的内容 :模块名.函数名/变量名/类名
list = [1,2,3,4,5]
#使用模块的变量
print(sum_sub.number)
#使用模块的函数
result = sum_sub.add(*list)
print(result)
#使用模块的类
sumsub = sum_sub.Sumsub(100)
sumsub.test()
导入模块方式2
#单独导入模块中的一种
from 模块名 import 函数名|变量名|类
#同时导入模块中的多种
from 模块名 import 函数名,变量名,类
#将模块内的所用东西导入
from 模块名 import *
通过第二种的导入方式我们可以更简单的使用模块的东西
from sum_sub import number,add
print(number)
list = [1,2,34,4]
add(*list)
*不是都是能取到模块的所有内容的
__All__ = ['add','number']
#变量
number = 100
name = 'sum_sub'
#函数
def add(*args):
pass
def sub(*args):
pass
#类
class Sumsub:
pass
像上述这种的方法我们用*只能取到其中的add和number
这里还要注意一点:无论是什么样的导入方法,模块的内容都会被加载
__All__ = ['add','number']
#变量
number = 100
name = 'sum_sub'
#函数
def add(*args):
pass
def sub(*args):
pass
#类
class Sumsub:
pass
if __name__ == '__main__':
add([1,2,3])
为此我们通常会用最后那两行的处理方法,这样可以让add()停止加载,这里的__ name __在模块内运行时是__main__,而在模块外运行则是模块名
单例模式
为了不让每次创建对象时都开辟内存,我们在开发中就会使用单例模式
- 对__ new __方法重写
class Sing:
# 私有化,让单例的地址存在于此
__instance = None
#重写__new__
def __new__(cls):
if cls.__instance is None:
cls.instance = object.__new__(cls)
return cls.instance
else:
return cls.__instance
- 优点:保证单线程的安全,可以节省内存空间