Python:元数据一直向下

Dan*_*nes 9 python metaclass traits

我有一个涉及Python元类的深奥问题.我正在为Web服务器端代码创建一个Python包,通过客户端代理可以轻松访问任意Python类.我的代理生成代码需要我想要包含在我的API中的所有Python类的目录.要创建此目录,我使用__metaclass__特殊属性将钩子放入类创建过程中.具体来说,"已发布"API中的所有类都将子类化为特定的基类PythonDirectPublic,该基类本身__metaclass__具有已设置的类以记录有关类创建的信息.

到现在为止还挺好.它变得复杂的地方是我希望PythonDirectPublic自己继承第三方类(enthought.traits.api.HasTraits).这个第三方类使用了__metaclass__.

那么管理两个元类的正确方法是什么?我的元类应该是Enthought元类的子类吗?或者我应该在我的元类的__new__方法中调用Enthought的元类来获取我将返回的类型对象?或者在这种特殊情况下是否还有其他一些神秘的咒语?

Pet*_*ley 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)
Run Code Online (Sandbox Code Playgroud)

如果您无权访问第三方基类的元类定义,则可以替换BaseMetaClassenthought.traits.api.HasTraits.__metaclass__.它很罗嗦,但它会起作用.