9

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

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

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

4

2 回答 2

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)

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

于 2010-07-27T19:02:16.200 回答
1

具体来说,“已发布”API 中的所有类都将继承一个特定的基类 PythonDirectPublic

您可以递归地使用 PythonDirectPublic 的结果,而不是添加另一个元类。子类()。

于 2011-01-28T21:16:13.707 回答