导出枚举

时间:2017-01-13 11:57:31

标签: python class inheritance enums

我想扩展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))。

2 个答案:

答案 0 :(得分:2)

似乎可以使用class MyMainClass { public $tester1; public function __construct() { add_action( 'init', array( &$this, 'mymainfunction' ) ); } public function mymainfunction() { $this->tester1 = 'test'; echo $this->tester1; } }

class MyOtherClass {

    public function __construct() {
        add_action( 'init', array(&$this, 'myotherfunction' ) );
    }

    public function myotherfunction() {
        require_once 'main.php';
        $getvariables = new MyMainClass();
        echo 'tester1 is:' . $getvariables->tester1;
    }


}

答案 1 :(得分:1)

使用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更适合(因为您只访问类数据),但可以添加依赖于成员的行为,就像使用普通的类/实例一样。