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