延迟分配Python元类参数(一种抽象元类实例)

时间:2014-09-11 22:13:02

标签: python class inheritance abstract-class metaclass

假设元类A需要参数。此元类的类B必须分配这些参数。假设这个类B是一个基类,那就是它的imediat派生类,它们应该分配这些参数。如果这有意义,这是否可行?如果这没有意义,为什么呢?

希望它有助于理解这个问题,这里是具体案例的摘录(并没有假装出奇妙),只显示相关部分(不是严格有效的Python,因为占位符)。请注意这个例子对于Python3是有效的,我不确定它是否与之前的Python版本一致(我在评论后添加的一点)。

class Type(type)
    def __new__(…, elements)
    …

class ArrowType(Type):
    def __new__(…, domain, codomain)
        # This build a suitable `elements`
        # parameter, from its own arguments,
        # for the call to `Type.__new__`
    …

class Function(
        object, 
        metaclass=ArrowType, 
        domain=…, 
        codomain=…)
    …

假设Function类应该是基类,但它并不具体。它的domaincodomain参数是ArrowType的摘要。假设没有合理的默认值,并提供None()或者知道什么的默认值,不被认为是好的(看起来像是黑客)。

我试图使Function抽象,但未能从中获得解决方案,因为参数仍然需要在Function的定义点进行实例化。或者可能是我做错了?

好吧,我可以使用一个函数:

def function(domain, codomain):
    class Function(
            object, 
            metaclass=ArrowType, 
            domain=domain, 
            codomain=codomain)
        …
    return Function

这有效,但我不喜欢它,原因有多种:1)Function在函数体中是“隐藏的”,2)这不再是一个基类(也不是真正的抽象) ,因为它结束了与从它派生的类一样多的基类(每个都调用function),3)实例获得的类名称由type(…)显示,是丑陋的。 / p>

简而言之,就Functiondomain参数而言,codomain是抽象的,这些参数将在其派生类中分配一些内容。

0 个答案:

没有答案
相关问题