python自定义模块和一些常用的模块以及单例模式

517 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天

模块

了解模块

模块就是代码组织的一种方式,将功能相近的函数或者类放到一个文件中

  • 优点
    1. 提高代码的可用性,可维护性。一个模块编写完毕后,可以很方便的在其他项目中导入
    2. 解决命名冲突,不同模块的相同命名不会冲突

常用标准库

标准库说明
builtins内置函数默认加载
math数学库
random随机数
os文件操作
re字符串正则匹配
copy拷贝
sysPython自身的运行环境
json编码和解码 json对象
logging记录日志,调试
functools常用工具
threading多线程
multiprocessing多进程
hashlib加密算法
datetime日期和时间

自定义模块

  • 我们来自定义创建一个加减运算的模块
  1. 定义加减运算的函数
#变量
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模块运算')
  1. 将上述的函数放到名为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
  • 优点:保证单线程的安全,可以节省内存空间