这篇文章主要介绍“Python中enum如何使用”,在日常操作中,相信很多人在Python中enum如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中enum如何使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!前言:枚举(enumeration
)在许多编程语言中常被表示为一种基础的数据结构使用,枚举帮助组织一系列密切相关的成员到同一个群组机制下,一般各种离散的属性都可以用枚举的数据结构定义,比如颜色、季节、国家、时间单位等
在Python中没有内置的枚举方法,起初模仿实现枚举属性的方式是使用成员:Direction.EAST
Direction.SOUTH检查成员:成员NORTH的类型是int,而不是Direction
,这个做法只是简单地将属性定义到类中Python
标准库enum实现了枚举属性的功能,接下来介绍enum的在实际工作生产中的用法enum
规定了一个有限集合的属性,限定只能使用集合内的值,明确地声明了哪些值是合法值,,如果输入不合法的值会引发错误,只要是想要从一个限定集合取值使用的方式就可以使用enum
来组织值。使用和类型检查:检查示例South
的的类型,结果如期望的是Directions
。name
和value
是两个有用的附加属性。实际工作中可能会这样使用:输入未定义的值时:可以用于将定义的值转换为获取需要的值输出:0.0
90.0
SOUTH angle: 180.0
SOUTH angle plus 90: 270.0key: 1.将函数方法用partial包起来;2.定义__call__
方法。忽略大小写:继承父类Enum
的_missing_
方法,在值的比较时将case改为一致即可输出:TimeUnit.MONTH
TimeUnit.MONTH第一种,执行SomeEnum
(“abc”)时想要引发自定义错误,其中”abc”是未定义的属性值输出:TimeUnit.MONTHValueError: ‘abc’ is not a valid TimeUnit
…
Exception: Customized exception第二种:执行SomeEnum.__getattr__
(“ABC”)时,想要引发自定义错误,其中”ABC”是未定义的属性名称,需要重写一下EnumMeta中的__getattr__方法,然后指定实例Enum对象的的metaclass输出:SomeEnum1.A1123…
Exception: Customized exception动态创建和修改Enum对象,可以在不修改原定义好的Enum类的情况下,追加修改,这里借用一个说明示例,具体的场景使用案例可以看下面的场景举例注:这里没有使用类直接声明的方式来执行枚举(定义时如果不指定值默认是从1开始的数字,也就相当于NORTH = auto(),auto是enum中的方法),仍然可以在后面为这个动态创建的DirectionFunctional
创建方法,这种在运行的过程中修改对象的方法也就是python
的monkey patching
。Functional APIs的用处和使用场景举例:在不修改某定义好的Enum类的代码块的情况下,下面示例中是Arithmethic
类,可以认为是某源码库我们不想修改它,然后增加这个Enum类的属性,有两种方法:
1.enum.Enum对象的属性不可以直接被修改,但我们可以动态创建一个新的Enum类,以拓展原来的Enum对象
例如要为下面的Enum对象Arithmetic增加一个取模成员MOD=”%”,但是又不能修改Arithmetic类中的代码块:就可以使用enum的Functional APIs方法:输出:Arithmetic.MOD2注意:动态创建Enum对象时,要指定原Enum类所在的module名称: “Yourmodule”,否则执行时可能会因为找不到源无法解析,qualname要指定类的位置:”Yourmodule.YourEnum”,值用字符串类型2.使用aenum.extend_enum可以动态修改enum.Enum对象为enum.Enum
类Arithmetic
增加一个指数成员EXP=”**”,且不修改免费云主机域名原来的Arithmetic类的代码块:输出:
8
相关推荐: R包安装报错configure: error怎么解决
这篇文章主要讲解了“R包安装报错configure: error怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“R包安装报错configure: error怎么解决”吧!configure: error:…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。