python枚举类的意义_用于ORM目的的python枚举类

编辑问题

我正在尝试创建一个类工厂,它可以生成具有以下属性的枚举类:

>从列表中初始化类

允许值(即,它)

自动生成!).

> Class创建自己的一个实例

对于每个允许的值.

>类不允许创建

任何其他实例一旦

上述步骤已完成(任何尝试

这样做会导致异常).

>类实例提供了一种方法

这个,给定一个值,返回一个

参考相应的

实例.

>类实例只有两个

属性:id和value.该

属性id自动递增

每个新实例;属性

value是实例的值

代表.

>类是可迭代的.我更喜欢

使用the accepted

answer to another SO question实现这一点

(具体来说,通过利用课程

注册表和定义iter

我的元类中的方法

枚举类是实例).

这就是我正在寻找的.请将原始文本(下方)视为问题的背景.很抱歉从一开始就不清楚.

更新的答案

我对aaronasterling的非常有用的答案做了一些修改.我以为我会在这里展示,以便其他人可以受益,所以如果我做错了,我会收到更多评论:)

我做的修改是:

(0)移植到p3k(iteritems – > items,元类 – >’metaclass =’,无需指定对象作为基类)

(1)将实例方法更改为@classmethod(现在我不需要对象来调用它,只需要类)

(2)我不是一举填充_registry,而是每次构造一个新元素时都更新它.这意味着我可以使用它的长度来设置id,所以我摆脱了_next_id属性.它也适用于我计划的扩展(见下文).

(3)从enum()中删除了classname参数.毕竟,该类名将是一个本地名称;无论如何,全局名称必须单独设置.所以我使用了一个虚拟’XXX’作为本地类名.我有点担心第二次调用该函数时会发生什么,但它似乎有效.如果有人知道原因,请告诉我.如果这是一个坏主意,我当然可以在每次调用时自动生成一个新的本地类名.

(4)扩展此类以允许用户添加新的枚举元素的选项.具体来说,如果使用不存在的值调用instance(),则会创建相应的对象,然后由该方法返回.如果我从解析文件中获取大量枚举值,这将非常有用.

def enum(values):

class EnumType(metaclass = IterRegistry):

_registry = {}

def __init__(self, value):

self.value = value

self.id = len(type(self)._registry)

type(self)._registry[value] = self

def __repr__(self):

return self.value

@classmethod

def instance(cls, value):

return cls._registry[value]

cls = type('XXX', (EnumType, ), {})

for value in values:

cls(value)

def __new__(cls, value):

if value in cls._registry:

return cls._registry[value]

else:

if cls.frozen:

raise TypeError('No more instances allowed')

else:

return object.__new__(cls)

cls.__new__ = staticmethod(__new__)

return cls

原文

我使用SQLAlchemy作为对象关系映射工具.它允许我将类映射到SQL数据库中的表.

我有几节课.一个类(Book)是具有一些实例数据的典型类.其他(流派,类型,封面等)都是基本的枚举类型;例如,流派只能是’科幻’,’浪漫’,’漫画’,’科学’;封面只能是“硬”,“软”;等等. Book与其他每个类之间存在多对一的关系.

我想半自动生成每个枚举样式的类.请注意,SQLAlchemy要求’scifi’表示为类Genre的实例;换句话说,简单地定义Genre.scifi = 0,Genre.romance = 1等是行不通的.

我尝试编写一个元类枚举,它接受类的名称和允许值列表作为参数.我希望如此

Genre = enum('Genre', ['scifi', 'romance', 'comic', 'science'])

会创建一个允许这些特定值的类,并且还可以创建我需要的每个对象:类型(‘科幻’),流派(‘浪漫’)等.

但我被卡住了.一个特别的问题是,在ORM意识到这个类之前我无法创建Genre(‘scifi’);另一方面,当ORM知道Genre时,我们不再是类构造函数了.

另外,我不确定我的方法是好的开始.

任何意见,将不胜感激.

解决方法:

基于更新的新答案

我认为这满足了您所有指定的要求.如果没有,我们可以添加你需要的任何东西.

def enum(classname, values):

class EnumMeta(type):

def __iter__(cls):

return cls._instances.itervalues()

class EnumType(object):

__metaclass__ = EnumMeta

_instances = {}

_next_id = 0

def __init__(self, value):

self.value = value

self.id = type(self)._next_id

type(self)._next_id += 1

def instance(self, value):

return type(self)._instances[value]

cls = type(classname, (EnumType, ), {})

instances = dict((value, cls(value)) for value in values)

cls._instances = instances

def __new__(cls, value):

raise TypeError('No more instances allowed')

cls.__new__ = staticmethod(__new__)

return cls

Genre = enum('Genre', ['scifi', 'comic', 'science'])

for item in Genre:

print item, item.value, item.id

assert(item is Genre(item.value))

assert(item is item.instance(item.value))

Genre('romance')

老答案

回应你对Noctis Skytower答案的评论,其中你说你想要Genre.comic =流派(‘漫画’)(未经测试):

class Genre(GenreBase):

genres = ['comic', 'scifi', ... ]

def __getattr__(self, attr):

if attr in type(self).genres:

self.__dict__[attr] = type(self)(attr)

return self.__dict__[attr]

这将创建一个类型实例,以响应尝试访问它并将其附加到请求它的实例.如果您希望将它附加到整个类,请替换该行

self.__dict__[attr] == type(self)(attr)

type(self).__dict__[attr] = type(self)(attr)

这使得所有子类都创建子类的实例以响应请求.如果您希望子类创建Genre的实例,请将type(self)(attr)替换为Genre(attr)

标签:python,enumeration,sqlalchemy

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

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

相关文章

java 生成校验验证码_java生成验证码并进行验证

一实现思路使用BufferedImage用于在内存中存储生成的验证码图片使用Graphics来进行验证码图片的绘制,并将绘制在图片上的验证码存放到session中用于后续验证最后通过ImageIO将生成的图片进行输出通过页面提交的验证码和存放在session中的验证码对比来进行校验二、生…

yy自动语音接待机器人_智能语音机器人落地产品有哪些?

据相关研究报告表明,在众多人工智能落地产品或者应用场景中,智能语音机器人无论从产品的成熟度还是应用的广泛度来说,都是人工智能行业最热门和最有前景的产品。智能语音机器人并不只是一款产品,它是所有智能语音系列产品的统称&a…

java资源文件获取属性_Java读写资源文件类Properties

Java中读写资源文件最重要的类是Properties1) 资源文件要求如下:1、properties文件是一个文本文件2、properties文件的语法有两种,一种是注释,一种属性配置。注 释:前面加上#号属性配置:以“键值”的方式书写一个属性的配置信息…

java被放弃了_为什么学Java那么容易放弃?

学习Java确实很容易就放弃,但是也很容易就学好,因为大多数人都是抱着试一试的心态,然后当后面就坚持不下去但是回过头来想一想,打游戏上分容易吗,一样是磕磕碰碰的,有时候十几连跪都不会放弃你上分的心情。…

python 隐马尔科夫_机器学习算法之——隐马尔可夫(Hidden Markov ModelsHMM)原理及Python实现...

前言上星期写了Kaggle竞赛的详细介绍及入门指导,但对于真正想要玩这个竞赛的伙伴,机器学习中的相关算法是必不可少的,即使是你不想获得名次和奖牌。那么,从本周开始,我将介绍在Kaggle比赛中的最基本的也是运用最广的机…

java编程50_java经典50编程题(1-10)

1.有一对兔子从出生后第三个月起,每个月都生一对小兔子,小兔子长到三个月后每个月又生一对兔子,假设兔子不死亡,问每个月兔子的总数为多少?分析过程图片发自简书App示例代码图片发自简书App运行结果图片发自简书App反思…

python替代hadoop_Python连接Hadoop数据中遇到的各种坑(汇总)

最近准备使用PythonHadoopPandas进行一些深度的分析与机器学习相关工作。(当然随着学习过程的进展,现在准备使用PythonSparkHadoop这样一套体系来搭建后续的工作环境),当然这是后话。但是这项工作首要条件就是将Python与Hadoop进行打通,本来认…

java 自动化测试_java写一个自动化测试

你模仿购物车试一下,同样是买东西,加上胜负平的赔率,输出改下应该就可以了package com.homework.lhh;import java.util.ArrayList;import java.util.Comparator;import java.util.Scanner;public class Ex04 {public static void main(String…

超大规模集成电路_纳米级超大规模集成电路芯片低功耗物理设计分析(二)

文 | 大顺简要介绍了功耗的组成,在此基础上从工艺、电路、门、系统四个层面探讨了纳米级超大规模集成电路的低功耗物理设计方法。关键词:纳米级;超大规模集成电路;电路芯片;电路设计02纳米级超大规模集成电路芯片低功耗…

java中的printnb_javaI/O系统笔记

1、File类File类的名字有一定的误导性;我们可能认为它指代的是文件,实际上却并非如此。它既能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称。1.1、目录列表器如果需要查看目录列表,可以通过file.list(FilenameFilt…

outlook反应慢的原因_保险管怎么区分慢熔和快熔?

保险丝快熔与慢熔的区别所有双帽;对于这样的产品特性和安全性熔丝; gG的”,即,与接触帽组合接触;即,所述双(内/外盖)的盖。和一般的小型或地下加工厂,以便执行切割角,降低生产成本,这将选择单个帽铆接“单&…

java成员内部类_Java中的内部类(二)成员内部类

Java中的成员内部类(实例内部类):相当于类中的一个成员变量,下面通过一个例子来观察成员内部类的特点public classOuter {//定义一个实例变量和一个静态变量private inta;private static intb;//定义一个静态方法和一个非静态方法public static voidsay(…

word 通配符_学会Word通配符,可以帮助我们批量处理好多事情

长文档需要批量修改或删除某些内容的时候,我们可以利用Word中的通配符来搞定这一切,当然,前提是你必须会使用它。通配符的功能非常强大,能够随意组合替换或删除我们定义的规则内容,下面易老师就分享一些关于查找替换通…

java存储键值结构_java-键值存储为主数据库

我将要开始一个项目,该项目的读写操作非常频繁且频繁.因此,环顾四周,我发现内存数据库正是为此目的而创建的.经过更多调查后,我进入了redis.Redis看起来很酷(虽然刚开始阅读,但是对此有很多了解).但是我主要只看过关系数据库,并且以元组和关系的方式来考虑数据(我认为我可以随着…

python 输入文件名查找_python 查找文件名包含指定字符串的方法

编写一个程序,能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出绝对路径。import osclass searchfile(object):def __init__(self,path.):self._pathpathself.abspathos.path.abspath(self._path) # 默认当前目录def fin…

java 运行 出现选择_Eclipse 运行出现java.lang.NoClassDefFoundError的解决方法

上篇博文也提到了这个问题,但没有深入的讲解。这次特意做了整理,详细解释其原因。先看错误java.lang.NoClassDefFoundError,显然是java虚拟机找不到指定的类,多数情况下是外部jar中的类。Eclipse的自动化,集成化&#…

设置熄屏_刚买的手机微信收不到信息提醒耽误事情,手机到手一定要这样设置...

手机使用过程中经常会遇到第三方软件接收不到信息提醒的状况,常常因此耽误了很多重要的事情,造成损失。特别是刚换新手机或者手机刚升级系统时发生的最多。一般都觉得是手机问题,其实只是手机的系统设置出现了问题,只要跟我按照以…

java判断对称素数_SM2非对称算法的原理及实现 Java SM2的代码案例 | 一生孤注掷温柔 | 小奋斗...

SM2椭圆曲线公钥密码算法:我国自主知识产权的商用密码算法,是ECC(Elliptic Curve Cryptosystem)算法的一种,基于椭圆曲线离散对数问题,计算复杂度是指数级,求解难度较大,同等安全程度要求下,椭圆…

multipartfile 获取音频时长_抖音音频下载捷径:一键提取音频,安卓+ios全通用,完全免费...

本文相关:抖音音频提取、抖音音频快捷指令、捷径怎么获取抖音音乐…昨天有抖友分享了一个抖音短视频链接,告诉我,她很喜欢这个视频里的歌曲,但是在很多歌曲app上面却找不到相同的版本,然后就问我,有没有什么…

python可以做特效吗_学习mel语言,Python,JavaScript到什么程度才能做一下大型特效,要自已开发插件脚本呢?...

感谢邀请。首先自己要在某一方面要擅长,认准一个定位。比如android是钥匙做前端应用软件的,python可以做爬虫及其人工智能,js做全段网页,java主要是做后端的1、我们程序员对于开发软件来说,无论你选择的是那种语言&…