我在重新定义__getitem__自定义子类时遇到了一些麻烦Enum.我__getitem__没被打电话.我想它与Enum元类有关,但我不确定是什么和为什么.
最小的工作示例(Python 3.4):
from enum import Enum, unique
@unique
class Test(Enum):
a = "a"
b = "b"
def __getitem__(self, name):
try:
return super().__getitem__(name)
except (TypeError, KeyError) as error:
print("TEST")
if __name__ == "__main__":
Test["a"]
Test["c"]
Run Code Online (Sandbox Code Playgroud)
结果:
$ python test.py
Traceback (most recent call last):
File "test.py", line 18, in <module>
Test["c"]
File "C:\Development\Python\Python34\lib\enum.py", line 258, in __getitem__
return cls._member_map_[name]
KeyError: 'c'
Run Code Online (Sandbox Code Playgroud)
正如@ shx2指出的那样,你没有调用__getitem__()你的Enum子类.以下是如何通过子类化Enum的元类来解决这个问题:
from enum import Enum, EnumMeta, unique
class TestEnumMeta(EnumMeta):
def __getitem__(self, name):
try:
return super().__getitem__(name)
except (TypeError, KeyError) as error:
print("TEST")
@unique
class Test(Enum, metaclass=TestEnumMeta):
a = "a"
b = "b"
if __name__ == "__main__":
Test["a"]
Test["c"] --> TEST
Run Code Online (Sandbox Code Playgroud)