我有一个涉及Python元类的深奥问题。我正在为Web服务器端代码创建一个Python包,通过客户端代理可以轻松访问任意Python类。我的代理生成代码需要我想要包含在我的API中的所有Python类的目录。要创建此目录,我使用__metaclass__
特殊属性将钩子放入类创建过程中。具体来说,“已发布”API中的所有类都将子类化特定的基类PythonDirectPublic
,该基类本身具有__metaclass__
,该基类已设置为记录有关类创建的信息。
到目前为止一切顺利。复杂的地方是我希望我的PythonDirectPublic
本身继承第三方类(enthought.traits.api.HasTraits
)。此第三方类也使用__metaclass__
。
那么管理两个元类的正确方法是什么?我的元类应该是Enthought元类的子类吗?或者我应该在我的元类的__new__
方法中调用Enthought的元类来获取我将返回的类型对象?或者在这种特殊情况下是否还有其他一些神秘的咒语?
答案 0 :(得分:5)
我的元类是否应该是Enthought元类的子类?
我相信这实际上是你唯一的选择。如果派生类的元类不是其所有基类的元类的子类,那么当您尝试创建派生类时,Python将抛出TypeError。因此,PythonDirectPublic
的元类应该类似于
class DerivedMetaClass(BaseMetaClass):
def __new__(cls, name, bases, dct):
# Do your custom memory allocation here, if any
# Now let base metaclass do its memory allocation stuff
return BaseMetaClass.__new__(cls, name, bases, dct)
def __init__(cls, name, bases, dct):
# Do your custom initialization here, if any
# This, I assume, is where your catalog creation stuff takes place
# Now let base metaclass do its initialization stuff
super(DerivedMetaClass, cls).__init__(name, bases, dct)
如果您无权访问第三方基类的元类定义,则可以将BaseMetaClass
替换为enthought.traits.api.HasTraits.__metaclass__
。这是罗嗦的,但它会奏效。
答案 1 :(得分:1)
具体来说,“已发布”API中的所有类都将子类化特定的基类,PythonDirectPublic
您可以递归使用PythonDirectPublic的结果,而不是添加另一个元类。子类()。