首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python :用`element.value`替换“`element`”

Python :用`element.value`替换“`element`”
EN

Stack Overflow用户
提问于 2019-06-24 18:00:35
回答 2查看 112关注 0票数 2

我有一个简单的Enum

代码语言:javascript
复制
class E(Enum):
    A = 'a'
    B = 'b'

要访问'a',我必须键入E.A.value。然而,value是我从Enum对象中需要的唯一东西。

如何编写Enum,其中'a'仅可由E.A访问

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-24 19:00:53

我环顾四周,却找不到一个很好的解决方案,就是用你想要使用的Enum类来解决这个问题。但是,如果您愿意回避使用Enum作为超类的想法,您可以将其结合在一起:

代码语言:javascript
复制
class Demo:
    # something with a 'value' method in it
    def __init__(self, val):
        self.value = val

def custom_enum(cls):
    # class decorator to get __getattribute__() to work properly
    # this is necessary because __getattribute__() only exists as an instance method,
    #   and there seems to be no direct equivalent for class methods
    return cls()

@custom_enum
class E:
    # first, define our enumerated variables in a dict
    _enums = {
        'A': Demo('a'),
        'B': Demo('b'),
        'chicken': Demo('cluck')
    }

    # then, override __getattribute__() to first get the key from the dict, 
    #   and return the .value property of it
    def __getattribute__(self, key):
        # because of the decorator, we can't call self._enums or else we get a RecursionError
        # therefore, we need to implicitly subclass `object`, and then
        #   deliberately invoke object.__getattribute__ on self, to access _enums
        my_enums = object.__getattribute__(self, '_enums')
        return my_enums[key].value

实际上,定义可枚举值就像编辑_enums dict一样简单。一旦您这样做了,它应该按照您希望的大致工作:

代码语言:javascript
复制
>>> E.A
'a'
>>> E.B
'b'
>>> E.chicken
'cluck'

从这里开始,您可以修改实现(例如,返回一个AttributeError而不是一个KeyError,或者重写__setattr__(),使枚举值不可设置,等等)。

票数 1
EN

Stack Overflow用户

发布于 2019-07-11 18:47:12

使用int作为值只是一个例子。它实际上应该是一个用户定义的类。

如果您将类/类型与Enum混合,那么只需访问成员本身就会为您提供该类型的一个子类型:

代码语言:javascript
复制
from enum import Enum

class MyClass:
    def __init__(self, color):
        self.color = color

class MyEnum(MyClass, Enum):
    first = 'red'
    second = 'green'
    third = 'blue'

并在使用中:

代码语言:javascript
复制
>>> MyEnum.first
<MyEnum.first: 'red'>

>>> MyEnum.first.color
'red'

>>> type(MyEnum.first)
<enum 'MyEnum'>

>>> isinstance(MyEnum.first, MyClass)
True

公开:我是Enum backport)库的作者。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56741740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档