代码之家  ›  专栏  ›  技术社区  ›  Dan Menes

python:一路向下的元类

  •  9
  • Dan Menes  · 技术社区  · 15 年前

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

    到现在为止,一直都还不错。复杂的地方是我想要我的 膀胱直肌 从第三方类继承( enthought.traits.api.HasTraits )第三方课程 使用A α-元 .

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

    2 回复  |  直到 14 年前
        1
  •  5
  •   Peter Milley    15 年前

    我的元类应该是恩萨斯元类的一个子类吗?

    我相信这是你唯一的选择。如果派生类的元类不是它所有基的元类的子类,那么当您试图创建派生类时,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__ . 它很冗长,但会起作用的。

        2
  •  1
  •   Isvara    14 年前

    具体来说,“已发布”API中的所有类都将子类化特定的基类pythondirectpublic

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