【发布时间】:2015-05-19 13:33:20
【问题描述】:
有没有办法让自定义元类与 enum34 包(Python 3 之前)配合得很好?
import enum
import six
class MyMeta(type):
def __new__(cls, class_name, bases, class_dict):
print("Does something useful.")
return super(MyMeta, cls).__new__(cls, class_name, bases, class_dict)
@six.add_metaclass(MyMeta)
class MyClass(object):
def __init__(self, *args, **kwargs):
pass
MyEnum = enum.Enum('MyEnum', [('One', 1), ('Two', 2), ('Three', 3)], type=MyClass)
以上内容目前在enum_class = super(EnumMeta, metacls).__new__(metacls, cls, bases, classdict) 的 enum34 中引发错误:
TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
【问题讨论】:
-
你想达到什么目的?为什么需要 mixin?
-
嗯,基本上我希望创建一个枚举,其值是从自定义类型派生的。不幸的是,有问题的类型有一个元类,这就是麻烦的开始。我想我只需要将我的值放入字典或其他东西中。
-
你可以从两个元类派生
MyMeta,但我个人不喜欢新的枚举并且会避免它们。 -
就像我说的,一旦我从
enum.EnumMeta派生出MyMeta,我就会得到另一个错误。我猜enum.EnumMeta.__new__在基类中寻找enum.Enum。不知道如何解决这个问题,这一切都变得非常复杂。 -
我在评论中写给你如何解决这个问题。