要使枚举类完全“只读”,只需要使用

__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枚举防止无效的属性分配相关推荐

  1. python enumeration_python模块之enum_上

    enum模块定义了: 4种枚举类:Enum, IntEnum, Flag, IntFlag 装饰器:unique() 助手:auto Flag, IntFlag, auto在python3.6中加入 ...

  2. python字典怎么设置_在python中设置字典中的属性

    在python中设置字典中的属性 是否可以在python中从字典创建一个对象,使每个键都是该对象的属性? 像这样的东西: d = { 'name': 'Oscar', 'lastName': 'Rey ...

  3. python读取枚举_在python中枚举(enumerate in python)

    在python中枚举(enumerate in python) 说, term='asdf'; InvertedIndex = {}; InvertedIndex[term] = [1,2,2,2,4 ...

  4. 如何枚举JavaScript对象的属性? [重复]

    本文翻译自:How do I enumerate the properties of a JavaScript object? [duplicate] This question already ha ...

  5. 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感...

    关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...

  6. 人工智能意念控制打字_智能打字稿批量属性分配

    人工智能意念控制打字 目的 (The Aim) I want the objects I use in my TypeScript code to let me set multiple proper ...

  7. Python学习中的无效语法常见原因和解决办法分析

    Python以其简单的语法而闻名.然而,当您第一次学习Python时,或者当您具有另一种编程语言的坚实背景时,您可能会遇到一些Python不允许的事情.如果您在尝试运行Python代码时收到过Synt ...

  8. JS基础 -- 枚举对象中的属性

    /** 什么事枚举对象中的属性?* 下面以一个例子来慢慢解释*///创建一个对象var obj = {name: '唐一彩',age: 4000,gender: '男',address: '白马寺'} ...

  9. python 判断类是否存在某个属性或方法

    python 判断类是否存在某个属性或方法 #!/usr/bin/env python # -*- coding:utf-8 -*- #@Time : 2020/5/3 0003 12:47 #@Au ...

最新文章

  1. 二分图的匹配问题以及求解算法
  2. html canvas 与小丑 。
  3. Java 8 - Stream流骚操作解读2_归约操作
  4. Office365----Project Online SKUs Change
  5. P1232-[NOI2013]树的计数【思维】
  6. python图像等比例压缩_python使用pil进行图像处理(等比例压缩、裁剪)实例代码
  7. ASP.NET Core 使用MySQL(Database First)
  8. 我的第一个MPI程序:利用矩形规则计算pi
  9. lstrip在python中是什么意思_为什么氦气吸入后会变声?
  10. Linux的巡检命令
  11. 寻找二叉树最小叶子节点值
  12. C#学习(二十八)——ManualResetEvent的理解和使用
  13. MT-考试座位-颜色排序
  14. 人生就是个学习、思考与实践的过程
  15. 计算机视觉与图形学-立体匹配专题-金字塔立体匹配网络
  16. webpack安装使用教程
  17. 通过微信公众号实现内容变现有哪些方式?
  18. 新签约和新开业酒店 | 华中首家美高梅、广州奥园喜来登、苏州裸心泊度假村、南昌八一广场格雷斯精选等酒店陆续签约和开业...
  19. 在linux安装java过程_挑战Java在Linux上安装过程分享
  20. 免费的java开发工具_Java那些最常用的免费开放工具,分享这15个!

热门文章

  1. 【OpenCV 例程200篇】88. 频率域拉普拉斯高通滤波
  2. 【OpenCV 例程200篇】84. 由低通滤波器得到高通滤波器
  3. mysql 社区版密码如何修改_如何用优雅的方法修改MySQL root密码
  4. mysql自增id用完了_MySQL 自增 ID 用完了怎么办?
  5. 数据结构-哈希与映射
  6. yum 不能安装应用,提示There are no enabled repos Run yum repolist all
  7. python 安装echarts
  8. Pytest跳过执行之@pytest.mark.skip()详解大全
  9. Chrome Extension Dark Theme
  10. 解题: SDOI 2011 染色