^c@sdZdefdYZdefdYZdefdYZdddYZd dd YZd Zd Z e d kree ndS(sEnumeration metaclass.t EnumMetaclasscBs)eZdZdZdZdZRS(sgMetaclass for enumeration. To define your own enumeration, do something like class Color(Enum): red = 1 green = 2 blue = 3 Now, Color.red, Color.green and Color.blue behave totally different: they are enumerated values, not integers. Enumerations cannot be instantiated; however they can be subclassed. cCstt|j|||g|_xk|jD]]}|jdoS|jds2t||||}t||||jj |q2q2WdS(Nt__( tsuperRt__init__t_memberstkeyst startswithtendswitht EnumInstancetsetattrtappend(tclstnametbasestdicttattrtenumval((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyRs cCs |dkr|jSt|dS(Nt __members__(RtAttributeError(R R ((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyt __getattr__s cCsd}}g|jD]*}t|tr|tk r|j^q}|r`ddj|}ng|jD]}d|t||f^qj}|rddj|}nd|j||fS(Nts(%s)s, s%s: %ds: {%s}s%s%s%s(t __bases__t isinstanceRtEnumt__name__tjoinRtgetattr(R ts1ts2tbaset enumbasestvalt enumvalues((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyt__repr__"s *,(Rt __module__t__doc__RRR!(((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyRs tFullEnumMetaclasscBseZdZdZRS(snMetaclass for full enumerations. A full enumeration displays all the values defined in base classes. cCs|tt|j|||xY|jD]N}t|tr&x6|jD](}||jkrE|jj|qEqEWq&q&WdS(N(RR$Rt__mro__RRRR (R R R RtobjR((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyR4s (RR"R#R(((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyR$.sRcBs2eZdZdZdZdZdZRS(s Class to represent an enumeration value. EnumInstance('Color', 'red', 12) prints as 'Color.red' and behaves like the integer 12 when compared, but doesn't support arithmetic. XXX Should it record the actual enumeration rather than just its name? cCstj||S(N(tintt__new__(R t classnametenumnametvalue((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyR(GscCs||_||_dS(N(t_EnumInstance__classnamet_EnumInstance__enumname(tselfR)R*R+((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyRJs cCsd|j|j|fS(NsEnumInstance(%s, %s, %d)(R,R-(R.((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyR!NscCsd|j|jfS(Ns%s.%s(R,R-(R.((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyt__str__Rs(RR"R#R(RR!R/(((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyR=s    RcBseZeZRS((RR"Rt __metaclass__(((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyRUstFullEnumcBseZeZRS((RR"R$R0(((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyR1XscCsdtfdY}|jGHt|jGH|j|jkGH|j|jkGH|jdkGH|jdkGHd|fdY}|jGH|jGH|j|jkGHdtfdY}d ||fd Y}|jGH|jGH|GH|GH|GH|GHdS( NtColorcBseZdZdZdZRS(iii(RR"tredtgreentblue(((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyR2]siit ExtendedColorcBs&eZdZdZdZdZdZRS(iiiii(RR"twhitetorangetyellowtpurpletblack(((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyR6js t OtherColorcBseZdZdZRS(ii(RR"R7R5(((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyR<vst MergedColorcBseZRS((RR"(((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyR=zs(RR3treprR5R8R7(R2R6R<R=((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyt_test[s&cCsdtfdY}|jGHt|jGH|j|jkGH|j|jkGH|jdkGH|jdkGHd|fdY}|jGH|jGH|j|jkGHdtfdY}d ||fd Y}|jGH|jGH|GH|GH|GH|GHdS( NR2cBseZdZdZdZRS(iii(RR"R3R4R5(((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyR2siiR6cBs&eZdZdZdZdZdZRS(iiiii(RR"R7R8R9R:R;(((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyR6s R<cBseZdZdZRS(ii(RR"R7R5(((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyR<sR=cBseZRS((RR"(((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyR=s(R1R3R>R5R8R7(R2R6R<R=((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyt_test2s&t__main__N((( R#ttypeRR$R'RRR1R?R@R(((s0/usr/lib64/python2.7/Demo/newmetaclasses/Enum.pyts+ * *