python enumeration_python枚举防止无效的属性分配
要使枚举类完全“只读”,只需要使用
__setattr__
hook
防止
全部的
属性分配。因为元类附加到类
之后
它是创建的,分配正确的枚举值没有问题。
就像伊桑的回答一样,我用的是
EnumMeta
类作为自定义元类的基础:
from enum import EnumMeta, Enum
class FrozenEnumMeta(EnumMeta):
"Enum metaclass that freezes an enum entirely"
def __new__(mcls, name, bases, classdict):
classdict['__frozenenummeta_creating_class__'] = True
enum = super().__new__(mcls, name, bases, classdict)
del enum.__frozenenummeta_creating_class__
return enum
def __call__(cls, value, names=None, *, module=None, **kwargs):
if names is None: # simple value lookup
return cls.__new__(cls, value)
enum = Enum._create_(value, names, module=module, **kwargs)
enum.__class__ = type(cls)
return enum
def __setattr__(cls, name, value):
members = cls.__dict__.get('_member_map_', {})
if hasattr(cls, '__frozenenummeta_creating_class__') or name in members:
return super().__setattr__(name, value)
if hasattr(cls, name):
msg = "{!r} object attribute {!r} is read-only"
else:
msg = "{!r} object has no attribute {!r}"
raise AttributeError(msg.format(cls.__name__, name))
def __delattr__(cls, name):
members = cls.__dict__.get('_member_map_', {})
if hasattr(cls, '__frozenenummeta_creating_class__') or name in members:
return super().__delattr__(name)
if hasattr(cls, name):
msg = "{!r} object attribute {!r} is read-only"
else:
msg = "{!r} object has no attribute {!r}"
raise AttributeError(msg.format(cls.__name__, name))
class FrozenEnum(Enum, metaclass=FrozenEnumMeta):
pass
上面区分了已经可用的属性和新的属性,以便于诊断。它还阻止属性
删除
,这可能同样重要!
它还提供元类和
FrozenEnum
基类
用于枚举;使用它而不是
Enum
.
冻结样品
Color
枚举:
>>> class Color(FrozenEnum):
... red = 1
... green = 2
... blue = 3
...
>>> list(Color)
[, , ]
>>> Color.foo = 'bar'
Traceback (most recent call last):
# ...
AttributeError: 'Color' object has no attribute 'foo'
>>> Color.red = 42
Traceback (most recent call last):
# ...
Cannot reassign members.
>>> del Color.red
Traceback (most recent call last):
# ...
AttributeError: Color: cannot delete Enum member.
注意
全部的
不允许更改属性,不允许使用新属性,也阻止删除。当名称是枚举成员时,我们委托给原始成员
枚举元
处理以保持错误消息稳定。
如果枚举使用更改枚举类属性的属性,则必须将这些属性白名单,或者允许设置以单个下划线开头的名称;在
第二组
确定允许设置和使用的名称
super().__setattr__(name, value)
对于这些异常,就像代码现在通过使用标志属性区分类构造和以后的更改一样。
上面的类可以像
Enum()
要以编程方式创建枚举,请执行以下操作:
e = FrozenEnum('Things', [('foo',1), ('bar',2)]))
演示:
>>> e = FrozenEnum('Things', [('foo',1), ('bar',2)])
>>> e
>>> e.foo = 'bar'
Traceback (most recent call last):
# ...
AttributeError: Cannot reassign members.
python enumeration_python枚举防止无效的属性分配相关推荐
- python enumeration_python模块之enum_上
enum模块定义了: 4种枚举类:Enum, IntEnum, Flag, IntFlag 装饰器:unique() 助手:auto Flag, IntFlag, auto在python3.6中加入 ...
- python字典怎么设置_在python中设置字典中的属性
在python中设置字典中的属性 是否可以在python中从字典创建一个对象,使每个键都是该对象的属性? 像这样的东西: d = { 'name': 'Oscar', 'lastName': 'Rey ...
- python读取枚举_在python中枚举(enumerate in python)
在python中枚举(enumerate in python) 说, term='asdf'; InvertedIndex = {}; InvertedIndex[term] = [1,2,2,2,4 ...
- 如何枚举JavaScript对象的属性? [重复]
本文翻译自:How do I enumerate the properties of a JavaScript object? [duplicate] This question already ha ...
- 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感...
关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...
- 人工智能意念控制打字_智能打字稿批量属性分配
人工智能意念控制打字 目的 (The Aim) I want the objects I use in my TypeScript code to let me set multiple proper ...
- Python学习中的无效语法常见原因和解决办法分析
Python以其简单的语法而闻名.然而,当您第一次学习Python时,或者当您具有另一种编程语言的坚实背景时,您可能会遇到一些Python不允许的事情.如果您在尝试运行Python代码时收到过Synt ...
- JS基础 -- 枚举对象中的属性
/** 什么事枚举对象中的属性?* 下面以一个例子来慢慢解释*///创建一个对象var obj = {name: '唐一彩',age: 4000,gender: '男',address: '白马寺'} ...
- python 判断类是否存在某个属性或方法
python 判断类是否存在某个属性或方法 #!/usr/bin/env python # -*- coding:utf-8 -*- #@Time : 2020/5/3 0003 12:47 #@Au ...
最新文章
- 二分图的匹配问题以及求解算法
- html canvas 与小丑 。
- Java 8 - Stream流骚操作解读2_归约操作
- Office365----Project Online SKUs Change
- P1232-[NOI2013]树的计数【思维】
- python图像等比例压缩_python使用pil进行图像处理(等比例压缩、裁剪)实例代码
- ASP.NET Core 使用MySQL(Database First)
- 我的第一个MPI程序:利用矩形规则计算pi
- lstrip在python中是什么意思_为什么氦气吸入后会变声?
- Linux的巡检命令
- 寻找二叉树最小叶子节点值
- C#学习(二十八)——ManualResetEvent的理解和使用
- MT-考试座位-颜色排序
- 人生就是个学习、思考与实践的过程
- 计算机视觉与图形学-立体匹配专题-金字塔立体匹配网络
- webpack安装使用教程
- 通过微信公众号实现内容变现有哪些方式?
- 新签约和新开业酒店 | 华中首家美高梅、广州奥园喜来登、苏州裸心泊度假村、南昌八一广场格雷斯精选等酒店陆续签约和开业...
- 在linux安装java过程_挑战Java在Linux上安装过程分享
- 免费的java开发工具_Java那些最常用的免费开放工具,分享这15个!
热门文章
- 【OpenCV 例程200篇】88. 频率域拉普拉斯高通滤波
- 【OpenCV 例程200篇】84. 由低通滤波器得到高通滤波器
- mysql 社区版密码如何修改_如何用优雅的方法修改MySQL root密码
- mysql自增id用完了_MySQL 自增 ID 用完了怎么办?
- 数据结构-哈希与映射
- yum 不能安装应用,提示There are no enabled repos Run yum repolist all
- python 安装echarts
- Pytest跳过执行之@pytest.mark.skip()详解大全
- Chrome Extension Dark Theme
- 解题: SDOI 2011 染色