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.pswp.cn/news/532027.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532027.shtml
英文地址,請注明出處:http://en.pswp.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、我們程序員對于開發軟件來說,無論你選擇的是那種語言&…