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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java wps linux 安装_ubuntu安装Java开发环境

1. 从sun主页JDK for Linux版本。这里的是jdk-6u6--i586.bin.2. 用root用户登录ubuntu,或是在普通用户下用su命令切换用户。切换到所需的安装目录。类型:cd 例如,要在 /usr/java/ 目录中 安装软件,请键入:cd /usr…

[BZOJ 2594] [Wc2006]水管局长数据加强版 【LCT】

题目链接:BZOJ - 2594 题目分析 这道题如果没有删边的操作,那么就是 NOIP2013 货车运输,求两点之间的一条路径,使得边权最大的边的边权尽量小。 那么,这条路径就是最小生成树上这两点之间的路径。 然而现在有了删边操作…

vs升级c++项目遇到的一些问题

1、error C1189: #error : This file requires _WIN32_WINNT to be #defined at least to 0x0403. Value 0x0501 or higher is recommended. 在工程的stdafx.h中,改为如下配置: #ifndef WINVER #define WINVER 0x0501 #endif #ifndef _WIN32_WINNT #def…

python模糊匹配忽略大小写_在python中忽略大小写的简单方法?

如果搜索多个单词,则创建一个集合是有意义的:print(set(brown_sents).intersection(zip(repeat(most_ambiguous_word),word_class_dict[most_ambiguous_word])))输出{(word2, wordclass2), (word2, wordclass3)}要理解它的作用,请将脚本保存到…

IAR7.51提示秘钥无效IAR 以及 CCDebug驱动(包含win7 64bit)

今天IAR不识别我的仿真器,然后我感觉驱动有问题,就把之前的驱动卸载了,但是按照以前的方法按章驱动(选择路径到IAR的某个目录),提示找不到驱动。。。 也不想重新装个IAR了,于是到CSDN上下载了这个驱动程序,…

cannot be resolved or is not a field

我通常的解决办法:1.看看是不是manifest.xml文件有错误,如果有的话,R.java是不会生成的2.一般来说R.layout.aaa.xml,这里的R是自己的包的R.java,不是android系统的R.java,所以如果引入包的时候有import and…

java解析时已到达文件结尾_IO流读取到文件末尾继续读取

import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;//正常情况//main()方法中第一个read()和和第二个read();是可以顺利执行完的…

百度地图动态显示查询结构

<script type"text/javascript">// 百度地图API功能function G(id) {return document.getElementById(id);}var map new BMap.Map("l-map");map.centerAndZoom("北京",12); // 初始化地图,设置城市和地图级别。var ac …

solr5.0mysql_ik扩展支持Solr配置详解

扩展ik原生代码&#xff1a;public class IKAnalyzerTokenizerFactory extends TokenizerFactory{private boolean useSmart;public boolean useSmart(){return this.useSmart;}public void setUseSmart(boolean useSmart) {this.useSmart useSmart;}public IKAnalyzerTokeniz…

apache htpasswd.exe创建密码

一、使用apache htpasswd.exe创建密码文件&#xff0c;命令请看PHP推荐教程&#xff1a;apache htpasswd命令用法详解 apache htpasswd命令用法实例 1、如何利用htpasswd命令添加用户&#xff1f; 在apache安装目录bin下找到htpasswd #usr/local/apache/bin/htpasswd -bc .pass…

考研复试考java_2019考研复试经验帖:过来人谈5件“小事”

关于复试&#xff0c;决定这你的命运&#xff0c;考生一定要好好把握。关于复试&#xff0c;你做好前期功课&#xff0c;足够了解了吗?下面新东方在线分享一位过来人的经验之谈&#xff0c;给大家最走心的忠告~~▶先来说说复试规则。在复试之前学校会公布学校的复试分数线&…

Hadoop2源码分析-RPC机制初识

1.概述 上一篇博客&#xff0c;讲述Hadoop V2的序列化机制&#xff0c;这为我们学习Hadoop V2的RPC机制奠定了基础。RPC的内容涵盖的信息有点多&#xff0c;包含Hadoop的序列化机制&#xff0c;RPC&#xff0c;代理&#xff0c;NIO等。若对Hadoop序列化不了解的同学&#xff0c…

svn客户端 java_svn纯java客户端SVNKit学习整理(转)

http://www.iteye.com/topic/688217http://blog.csdn.net/feiren127/article/details/7551782把svnkit.jar添加到项目中&#xff0c;用于实现svn功能。 把jackson-all-1.6.2.jar添加到项目中&#xff0c;用于显示树列表。把javaee.ar添加到项目中。新建一个类(SVNUtil.class)实…

贪心 BestCoder Round #39 1001 Delete

题目传送门 1 /*2 贪心水题&#xff1a;找出出现次数>1的次数和res&#xff0c;如果要减去的比res小&#xff0c;那么总的不同的数字tot不会少&#xff1b;3 否则再在tot里减去多余的即为答案4 用set容器也可以做&#xff0c;思路一样5 */6 #include &l…

java this() super()_java中的this和super

this对象本身。public class ThisTest {ThisTest tTest;public ThisTest(){tTest this;}public void test(){System.out.println(this);}public static void main(String arg[]){new ThisTest().test();}}成员方法引用。成员变量引用。public class ThisTest {String name;Str…

配置汇编环境:使用vs2010+MASM

1、将MASM32下载并安装到根目录&#xff08;得到include和lib文件夹&#xff09;&#xff0c;官网即可下载&#xff0c;有64位版本2、配置vs2010 &#xff08;1&#xff09;添加项目 a、新建空白解决方案 b、添加空项目 c、项目属性->生成自定义-&g…

java 抽象类命名_Java的抽象类和接口

一.抽象类首先看抽象方法&#xff1a;抽象方法只有方法签名&#xff0c;没有方法的实现。并且被abstract修饰。 例如&#xff1a; abstract void test();有抽象方法的类只能被定义为抽象类&#xff0c;抽象类里可以没有抽象方法。抽象类的规则&#xff1a;抽象类必须使用abstr…

JSP、Servlet中get请求和post请求的区别总结

在学习JavaWeb最初的开始阶段&#xff0c;大家都会遇到HttpServlet中的doGet和doPost方法。前两天看《Head First Servlets & JSP》看到其中讲关于Servlet中get请求和post请求的区别&#xff0c;现总结如下&#xff1a; 1&#xff1a;请求数据的大小不同。 因为get请求的数…

用java解决约瑟夫循环问题_Java采用循环链表结构求解约瑟夫问题

本文实例讲述了Java采用循环链表结构求解约瑟夫问题的方法。分享给大家供大家参考。具体分析如下&#xff1a;这是第一次java考试的试题&#xff0c;对于没看过链表的同学来说就不会做&#xff0c;现在回头看看&#xff0c;还真不难。约瑟夫问题&#xff1a;有n个人&#xff0c…

在ubuntu上搭建开发环境9---Ubuntu删除ibus出现的问题及解决

删除 ibus输入法&#xff1a;  sudo apt-get install ibus 我们会遇到下面的问题 Ubuntu 14.04 系统设置很多选项消失。 其实遇到这个问题的一个最主要的原因是之前执行过卸载ibus输入法的操作&#xff0c;所以为了避免这个问题请不要卸载ibus输入法&#xff0c;大家依然可以…