Python 枚举类 自定义状态
原创
文章标签 python 状态码 初始状态 获取值 文章分类 Python 后端开发
©著作权归作者所有:来自51CTO博客作者ch3nnn的原创作品,请联系作者获取转载授权,否则将追究法律责任
- 枚举类不支持实例化;
- 成员的值不能在类的外部做任何修改,每个成员都有
​name​
,​value​
两个属性,其中​name​
为该枚举值的名称,​value​
为该枚举值的内容; - 定义枚举时,成员名称不允许重复,但在默认情况下,不同的成员值允许相同,两个相同值的成员,第二个成员的名称将会被视作第一个成员的别名,若要限制不能定义相同值的成员。可以使用装饰器
​@unique​
; - 枚举支持迭代器,可以遍历枚举成员;如果枚举有值重复的成员,循环遍历枚举时只获取值重复成员的第一个成员,若想把值重复的成员也遍历出来,要用枚举的一个特殊属性:
​__members__​
;
from enum import Enumfrom typing import Optionalclass BaseEnm(Enum): def getCode(self): """根据枚举名称取状态码code @return: 状态码code """ return self.value[0] def getMessage(self): """根据枚举名称取状态说明message @return: 状态说明message """ return self.value[1] @classmethod def messageByCode(cls, code) -> Optional[str]: """根据状态码获取状态码说明""" for name, member in cls.__members__.items(): if code in member.value: return cls[name].getMessage() return None@uniqueclass CallStateResult(BaseEnm): """通话状态结果""" USER_STATE_NULL = (0, "未知的初始状态") USER_STATE_ANSWERED = (1, "接通") USER_STATE_POWER_OFF = (2, "关机") USER_STATE_NOT_EXIST = (3, "空号") USER_STATE_INVALID_NUM = (4, "非法号码") USER_STATE_OUTSERVICE = (5, "停机") USER_STATE_NOT_IN_SERVICE = (6, "不在服务区") USER_STATE_NOT_ANSWER = (7, "无人接听") USER_STATE_BUSY = (8, "用户忙") USER_STATE_NOT_REACHABLE = (9, "无法接通") USER_STATE_NOT_LOCALNUM_NEED_ZERO = (10, "本地号码未加零") USER_STATE_LOCALNUM_ADD_ZERO = (11, "本地号码多加零") USER_STATE_BARRING_INCOMING = (12, "呼入限制") USER_STATE_CALL_REMINDER = (13, "来电提醒") USER_STATE_DEFAULTING = (14, "欠费") USER_STATE_LINE_BUSY = (15, "网络忙") USER_STATE_FORWARDED = (16, "呼叫转移失败") USER_STATE_CANNOT_CONNECTED = (17, "无法接听") USER_STATE_NUMBER_CHANGE = (18, "改号") USER_STATE_LINE_FAULT = (19, "线路故障") USER_STATE_CALL_REJECTED = (20, "拒接") USER_STATE_NOT_RECOGNITION = (21, "未知状态") USER_STATE_CALL_FAILED = (22, "呼叫失败") USER_STATE_HANGUP = (100, "通话结束")if __name__ == '__main__': print(CallStateResult.USER_STATE_NULL) print(CallStateResult.USER_STATE_NULL.getCode()) print(CallStateResult.USER_STATE_NULL.getMessage()) print(CallStateResult.messageByCode(0))
输出
CallStateResult.USER_STATE_NULL0未知的初始状态未知的初始状态
- 赞
- 收藏
- 评论
- *举报
上一篇:python如何关闭线程
下一篇:rest_framework_xml 解析xml成Python 字典格式数据对象
Original: https://blog.51cto.com/u_15722381/5483109
Author: ch3nnn
Title: Python 枚举类 自定义状态
相关阅读1
Title: Python图像处理丨如何调用OpenCV绘制直方图
摘要:本篇文章主要讲解灰度直方图的基本概念,Python调用OpenCV实现绘制图像直方图。
本文分享自华为云社区《[Python图像处理] 十一.灰度直方图概念及OpenCV绘制直方图》,作者:eastmount。
一. 灰度直方图基本概念
什么是灰度直方图?
灰度直方图(histogram)是灰度级的函数,描述的是图像中每种灰度级像素的个数,反映图像中每种灰度出现的频率。横坐标是灰度级,纵坐标是灰度级出现的频率。
对于连续图像,平滑地从中心的高灰度级变化到边缘的低灰度级。直方图定义为:
其中A(D)为阈值面积函数:为一幅连续图像中被具有灰度级D的所有轮廓线所包围的面积。对于离散函数,固定ΔD为1,则:H(D)=A(D)-A(D+1)。
色彩直方图是高维直方图的特例,它统计色彩的出现频率,即色彩概率分布信息。通常这需要一定的量化过程,将色彩分成若干互不重叠的种类。一般不直接在RGB色彩空间中统计,而是在将亮度分离出来后,对代表色彩部分的信息进行统计,如在HSI空间的HS子空间、YUV空间的UV子空间,以及其它反映人类视觉特点的彩色空间表示中进行。
直方图的计算方法如下:
依据定义,若图像具有L(通常L=256,即8位灰度级)级灰度,则大小为MxN的灰度图像f(x,y)的灰度直方图hist[0...L-1]可用如下计算获得。
1、初始化 hist[k]=0; k=0,...,L-1
2、统计 hist[f(x,y)]++; x=0,...,M-1, y =0,...,N-1
3、归一化 hist[f(x,y)]/=M*N
那么说了这么多,直方图究竟有什么作用呢?
在使用轮廓线确定物体边界时,通过直方图更好的选择边界阈值,进行阈值化处理;对物体与背景有较强对比的景物的分割特别有用;简单物体的面积和综合光密度IOD可以通过图像的直方图求得。
二. 绘制直方图
1.基础概念
在直方图中,横坐标表示图像中各个像素点的灰度级,纵坐标表示具有该灰度级的像素个数。
假设存在一个3*3的图像,如下图所示,x数组统计的是像素点的灰度级,y数组统计的是具有该灰度级的像素个数。其中,灰度为1的像素共3个,灰度为2的像素共1个,灰度为3的像素共2个,灰度为4的像素共1个,灰度为5的像素共2个。
x = [1, 2, 3, 4, 5]
y = [3, 1, 2, 1, 2]
绘制的折线图如下所示:
绘制的直方图如下所示:
如果灰度级为0-255(最小值0黑色,最大值255白色),同样可以绘制对应的直方图,下图是三张图片拼接而成及其对应的直方图。
2.归一化直方图
该直方图的横坐标表示图像中各个像素点的灰度级,纵坐标表示出现这个灰度级的概率。其计算方法如下:
(1) 先计算灰度级及对应像素的个数
x = [1, 2, 3, 4, 5]
t = [3, 1, 2, 1, 2]
(2) 统计总的像素个数
n = (3 + 1 + 2 + 1 +2) = 9
(3) 统计各个灰度级的出现概率
y = t / n = [3/9, 1/9, 2/9, 1/9, 2/9]
3.绘制直方图
主要调用matplotlib的子库pyplot实现,它提供了类似于Matlab的绘图框架,matplotlib是非常强大基础的一个Python绘图包。Provides a Matlab-like plotting framework. 导入代码如下:
import matplotlib.pyplot as plt
其中绘制直方图主要调用hist函数实现,它根据数据源和像素级绘制直方图。函数原型如下:
hist(数据源, 像素级)参数:数据源必须是一维数组,通常需要通过函数ravel()拉直图像像素级一般是256,表示[0, 255]
函数ravel()将多维数组降为一维数组,格式为:
一维数组 = 多维数组.ravel()
4.代码实现
#encoding:utf-8import cv2 import numpy as npimport matplotlib.pyplot as pltsrc = cv2.imread('test01.jpg')cv2.imshow("src", src)cv2.waitKey(0)cv2.destroyAllWindows()plt.hist(src.ravel(), 256)plt.show()
输出结果如下所示:
三. 使用OpenCV统计绘制直方图
1.函数原型
前面讲解调用matplotlib库绘制直方图,接下来讲解使用OpenCV统计绘制直方图的例子。
直方图横坐标:图像中各个像素点的灰度级
直方图纵坐标:具有该灰度级的像素个数
主要调用函数calcHist()实现:
hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)
参数:
- hist表示直方图,返回的是一个二维数组
- images表示原始图像
- channels表示指定通道,通道编号需要用中括号括起,输入图像是灰度图像时,它的值为[0],彩色图像则为[0]、[1]、[2],分别表示B、G、R
- mask表示掩码图像,统计整副图像的直方图,设为None,统计图像的某一部分直方图时,需要掩码图像
- histSize表示BINS的数量,参数子集的数目,如下图当bins=3表示三个灰度级
- ranges表示像素值范围,例如[0, 255]
- accumulate表示累计叠加标识,默认为false,如果被设置为true,则直方图在开始分配时不会被清零,该参数允许从多个对象中计算单个直方图,或者用于实时更新直方图;多个直方图的累积结果用于对一组图像的直方图计算
2.代码实现
首先计算图像灰度级的基本大小、形状及内容。
#encoding:utf-8import cv2 import numpy as npimport matplotlib.pyplot as pltsrc = cv2.imread('test01.jpg')#参数:原图像 通道[0]-B 掩码 BINS为256 像素范围0-255 hist = cv2.calcHist([src], [0], None, [256], [0,255])print(type(hist))print(hist.size)print(hist.shape)print(hist)
输出结果如下所示:
下面是绘制图像的代码,首先补充一些matplotlib库绘制图像代码,也推荐我的文章。
[Python数据挖掘课程] 六.Numpy、Pandas和Matplotlib包基础知识
#encoding:utf-8import cv2 import numpy as npimport matplotlib.pyplot as plt#绘制sin函数曲线x1 = np.arange(0, 6, 0.1)y1 = np.sin(x1)plt.plot(x1, y1)#绘制坐标点折现x2 = [0, 1, 2, 3, 4, 5, 6]y2 = [0.3, 0.4, 2.5, 3.4, 4, 5.8, 7.2]plt.plot(x2, y2)#省略有规则递增的x2参数 y3 = [0, 0.5, 1.5, 2.4, 4.6, 8]plt.plot(y3, color="r")plt.show()
输出结果有三条线,如下所示:
最后给出调用calcHist()计算B、G、R灰度级并绘制图形的代码。
#encoding:utf-8import cv2 import numpy as npimport matplotlib.pyplot as pltsrc = cv2.imread('test01.jpg')histb = cv2.calcHist([src], [0], None, [256], [0,255])histg = cv2.calcHist([src], [1], None, [256], [0,255])histr = cv2.calcHist([src], [2], None, [256], [0,255])cv2.imshow("src", src)cv2.waitKey(0)cv2.destroyAllWindows()plt.plot(histb, color='b')plt.plot(histg, color='g')plt.plot(histr, color='r')plt.show()
输出结果如下图所示:
Original: https://blog.51cto.com/u_15214399/5548199
Author: 华为云开发者联盟
Title: Python图像处理丨如何调用OpenCV绘制直方图
相关阅读2
Title: python必备基础
1. 基础函数
序号 函数 说明 1 print() 打印 2 input() 输入 3 int() 转化为整形 4 float() 转化为浮点型 5 str() 转化为字符串 6 type() 返回对象类型 7 isinstance() 判断对象类型(返回布尔值)
2. 流程控制
序号 函数 说明 1 if语句:执行 条件判断 2 if 条件:代码1 else:代码2 条件判断 3 while 判断循环 4 for 计数循环 5 range() 范围控制,可控制起始位置和步长 6 break 跳出循环 7 continue 跳出本次循环,后面的循环继续执行
3.字符串(不可修改)
序号 函数 说明 1 capitalize() 首字符大写,其余小写 2 casefold() 字符串变小写 3 encode() 编码(str-bytes) 4 decode() 解码(bytes-str) 5 count(字符,开始下标,结束下标) 返回字符出现次数 6 find(字符,开始下标,结束下标) 返回字符第一次出现的索引位置,未查到返回-1 7 index(字符,开始下标,结束下标) 返回字符第一次出现的索引位置 8 upper() 将字符串转化为大写 9 lower() 将字符串转化为小写 10 format() 将字符串按某种格式输出,可以用空{}、数字{1}、字母{a}占位 11 strip(字符) 移除字符串中指定字符 12 end='' 末位无缝连接 13 split() 将字符串转换为列表
4. 列表
序号 函数 说明 1 append() 尾部增加元素 2 insert(索引位置,元素) 指定位置增加元素 3 clear() 清空列表 4 pop(索引位置) 删除指定位置元素,不传位置默认删除末尾元素 5 remove(元素) 删除指定元素 6 del() 删除元素或整个列表 7 extend(可迭代对象) 将可迭待对象分别添加到列表中 8 copy() 浅拷贝,copy后的数据修改后,原数据也会被修改。deepcopy不会变更原数据。 9 count(元素) 返回元素在列表中出现次数 10 index(元素,开始下标,结束下标) 默认返回元素在列表中第一个索引位置 11 reverse() 翻转 12 sort(key=str.lower,reverse=True) 对列表内元素进行排序,reverse=True为减序 13 len() 返回列表长度
5. 元组(不可修改)
list(元组)
将元组转换为列表
tuple(列表)
列表转换为元组
其他操作类似列表
6.字典
序号 函数 说明 1 update({键:键值}) 新增键值对 2 get(键) 返回键对应键值,键不存在则返回空 3 del(dict1[键]) 删除键值对 4 pop(键) 删除键值对 5 clear() 清空字典 6 items() 键值对 7 keys() 返回键 8 values() 返回键值 9 max(dict1) 返回字典中最大的键
7、函数(常用内置函数)
序号 函数 说明 1 函数名.doc 获取函数的文档内容 2 help(函数名) 查看函数文档 3 global 变量 声明变量为全局变量(可用于任何地方) 4 nonlocal 变量 声明变量为全局变量(用于函数嵌套,变量存在于上一级目录)
8、进程和线程
序号 函数 说明 1 os.getpid() 获取当前进程编号 2 multiprocessing.current_process() 获取当前进程名字 3 Thread(target=None,name=None,args=(),kwargs=None) 创建进程实例 4 threading.current_thread() 获取当前进程名字
9.文件操作
(1)常规文件操作
序号 函数 说明 1 open(文件名,mode) 打开文件(mode: r只读, r+读写, w新建(会覆盖原有文件),a追加写入,b二进制模式,w+新建读写,t文本模式) 2 write("xxx") 向文件中写入内容 3 read() 读取文件内容 4 close() 关闭文件
file的对象属性
序号 函数 说明 1 closed 如果文件已关闭,返回True,未关闭返回False 2 mode 返回文件对象访问模式 3 name 返回文件名称
file对象的读取方法
序号 函数 说明 1 read([字节数]) 读取文件中内容 2 readlines() 读取文件所有行 3 readline() 读取文件一行
(2)OS模块
关于文件
序号 函数 说明 1 os.rename(原文件名,新文件名) 文件重命名 2 os.remove(文件名) 删除文件
关于文件夹
序号 函数 说明 1 os.mkdir(文件夹名称) 新建文件夹 2 os.rmdir(文件夹名称) 删除文件夹 3 getcwd() 获取当前目录路径 4 chdir(目录路径) 切换目录 5 listdir(文件夹名称) 获取当前文件夹下所有文件和文件夹,返回一个列表
python常用内置函数
https://blog.csdn.net/qq_45499910/article/details/125977400
家文化的核心观念用一个字概括就是和!家族要想兴旺发达,孝道和悌道缺一不可。
Original: https://www.cnblogs.com/lzcnblogs/p/16628409.html
Author: 心如__止水
Title: python必备基础
相关阅读3
Title: 【信号去噪】基于硬阈值、软阈值、半软阈值、Maxmin阈值、Garrote阈值小波变换实现心音去噪附matlab代码
1 内容介绍
小波变换在信号的滤波降噪处理中应用非常广泛,针对传统小波阈值去噪算法中软,硬阈值函数以及Garrote阈值函数的不足,构造出一个新的阈值函数,并采用新的阈值确定方法,对信号的去噪处理更加灵活,克服了传统阈值函数的不足.通过Matlab软件,对传统阈值函数以及本文提出的改进阈值函数进行去噪处理仿真,在信噪比(SNR)和均方误差(MSE)两个方面进行定量对比.实验结果表明,使用改进的阈值函数进行去噪处理后,信号具有更高的信噪比和更小的均方误差,去噪效果优于传统方法.
2 仿真代码
clear all;
close all
[x,Fs]=audioread('d00.wav');
t=(0:length(x)-1)/Fs; %计算样本时刻
noise=0.2*rand(length(x),1);
noise1 = wgn(length(x),1,-30);
x0=x; %原始信号
x=x+noise1;
subplot(331); plot(t,x0); ylabel('幅度'); xlabel('时间(s)'); title('原始心音信号');
subplot(332); plot(t,x); ylabel('幅度'); xlabel('时间(s)'); title('含噪心音信号');
ylim([-1 1]);
[xd1,xd2,xd3,xd4,xd5,xd6]=softthersh(x,6,'db6');
subplot(333); plot(t,xd1); ylabel('幅度'); xlabel('时间(s)'); title('硬阈值心音信号');
subplot(334); plot(t,xd2); ylabel('幅度'); xlabel('时间(s)'); title('软阈值心音信号');
subplot(335); plot(t,xd3); ylabel('幅度'); xlabel('时间(s)'); title('半软阈值心音信号');
subplot(336); plot(t,xd4); ylabel('幅度'); xlabel('时间(s)'); title('Minimax阈值心音信号');
subplot(337); plot(t,xd5); ylabel('幅度'); xlabel('时间(s)'); title('Garrote阈值心音信号');
subplot(338); plot(t,xd6); ylabel('幅度'); xlabel('时间(s)'); title('改进阈值心音信号');
% subplot(339); plot(t,xd7); ylabel('幅度'); xlabel('时间(s)'); title('新改进阈值心音信号');
[SNR1,RMSE1]=Evaluate(x0,xd1);
[SNR2,RMSE2]=Evaluate(x0,xd2);
[SNR3,RMSE3]=Evaluate(x0,xd3);
[SNR4,RMSE4]=Evaluate(x0,xd4);
[SNR5,RMSE5]=Evaluate(x0,xd5);
[SNR6,RMSE6]=Evaluate(x0,xd6);
% [SNR7,RMSE7]=Evaluate(x0,xd7);
3 运行结果
4 参考文献
[1]袁孟宇. 基于改进小波阈值法的动液面信号去噪研究[D]. 东北石油大学.
[2]刘佳林, 孙旋. 基于改进阈值函数小波语音增强方法的研究[J]. 软件导刊, 2010(2):3.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。
Original: https://blog.51cto.com/u_15287693/5615507
Author: matlab科研助手
Title: 【信号去噪】基于硬阈值、软阈值、半软阈值、Maxmin阈值、Garrote阈值小波变换实现心音去噪附matlab代码