kol*_*ery 4 python enums python-3.x
我是Python的初学者,所以如果这是显而易见的事情,请原谅我.
我有一个枚举类,我希望能够比较成员.下面的代码似乎做我想要的(但不是我想要的)
import enum
class AB(enum.Enum):
a=1
b=2
c=3
d=4
e=5
@classmethod
def le(cls, a, b):
lst = [cls.a, cls.b, cls.c, cls.d, cls.e]
ia = lst.index(a)
ib = lst.index(b)
return(ia <= ib)
if AB.le(AB.a, AB.b):
print('Do this')
else:
print('Do that')
Run Code Online (Sandbox Code Playgroud)
现在我的问题是如何编码比较运算符,__le__以便我可以运行下面的代码?
mem1 = AB.a
mem2 = AB.c
if mem1 <= mem2 :
print('Do this')
else:
print('Do that')
Run Code Online (Sandbox Code Playgroud)
Enum子类有点特殊,因为所有枚举值都成为类的实例(只需进行一些调整).这意味着您可以"只"在Enum子类上定义一个普通方法,它们将在每个枚举值上可用.
这也适用于特殊方法object.__le__(); 只是把它定义为一个普通的方法,没有一个classmethod:
class AB(enum.Enum):
def __le__(self, b):
return self.value <= b.value
a = 1
b = 2
c = 3
d = 4
e = 5
Run Code Online (Sandbox Code Playgroud)
请注意,我使用了instance属性.value,就像你可以做的那样AB.a.value.
你也可以使用这IntEnum门课 ; 这使得每个枚举值成为其子类int,并且它们可以自然地进行比较:
class AB(enum.IntEnum):
a = 1
b = 2
c = 3
d = 4
e = 5
Run Code Online (Sandbox Code Playgroud)
演示:
>>> import enum
>>> class AB(enum.Enum):
... def __le__(self, b):
... return self.value <= b.value
... a = 1
... b = 2
... c = 3
... d = 4
... e = 5
...
>>> AB.a <= AB.b
True
>>> AB.b <= AB.a
False
>>> AB.a < AB.b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: AB() < AB()
Run Code Online (Sandbox Code Playgroud)
并IntEnum用作基础:
>>> class AB(enum.IntEnum):
... a = 1
... b = 2
... c = 3
... d = 4
... e = 5
...
>>> AB.a <= AB.b
True
>>> AB.b >= AB.a
True
>>> AB.b > AB.a
True
>>> AB.a + AB.b
3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1084 次 |
| 最近记录: |