【问题标题】:Using __class__ to get properties when deriving Enum派生Enum时使用__class__获取属性
【发布时间】:2017-01-13 11:57:31
【问题描述】:

我想扩展Enum 类并添加一个实用函数,该函数将被其他类使用。

考虑这段代码:

from enum import Enum

class BaseEnum(Enum):
    def get_items():
        print(__class__)
        return __class__.__members__.items()

class DerivedEnum(BaseEnum):
    X = 1
    Y = 2

print(BaseEnum.get_items())
print(DerivedEnum.get_items())

这显然不能按预期工作,因为__class__ 总是指BaseEnum

我知道我可以将代码更改为:

from enum import Enum

def get_enum_items(enum_class):
    return enum_class.__members__.items()

class AnotherEnum(Enum):
    X = 1
    Y = 2

    def get_items():
        return get_enum_items(__class__)

print(AnotherEnum.get_items())

这确实符合我的要求,但要求我为我编写的所有Enum 子类编写完全相同的方法。

Python 中有没有类似__actual_class__ 的东西?我想它需要制作类似虚拟静态方法的东西。

据我了解Enum 类,我们从来没有真正实例化它,所以我看不出有办法使用对实例的引用(例如type(self))。

【问题讨论】:

    标签: python class inheritance enums


    【解决方案1】:

    似乎可以使用classmethod

    from enum import Enum
    
    class BaseEnum(Enum):
        @classmethod
        def get_items(cls):
            print(cls)
            return cls.__members__.items()
    
    class DerivedEnum(BaseEnum):
        X = 1
        Y = 2
    
    print(BaseEnum.get_items())
    print(DerivedEnum.get_items())
    

    【讨论】:

    • 确实如此!谢谢。
    【解决方案2】:

    使用classmethod 是最直接的方式,如bruno's answer 所示。但是,除非您需要将结果作为 (name, member) 元组的列表,否则最简单的方法是:

    >>> list(DerivedEnum)
    [<DerivedEnum.X: 1>, <DerivedEnum.Y: 2>]
    

    就实例化 Enum 类而言:每个成员都是其类的一个实例,因此您可以这样做:

    def get_items(self):
        return self.__class__.__members__.items()
    

    虽然classmethod 更适合这种情况(因为您只访问类数据),但可以添加依赖于成员的行为,就像普通类/实例一样。

    【讨论】:

      猜你喜欢
      • 2022-06-10
      • 1970-01-01
      • 2017-11-05
      • 2016-02-03
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      相关资源
      最近更新 更多