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

Python元类参数的延迟分配(一种抽象元类实例),python,class,inheritance,abstract-class,metaclass,Python,Class,Inheritance,Abstract Class,Metaclass,假设元类a需要参数。该元类的B类必须分配这些参数。假设这个类B是一个基类,这是它的IMedia派生类,它被期望分配这些参数。如果这有意义,这是否可行?如果这是没有意义的,那么为什么呢 希望这有助于理解这个问题,这里是一个具体案例的摘录,它并不假装奇妙,因为由于占位符的原因,只有相关部分显示为不严格有效的Python。请注意,此示例对Python有效 3,我不确定之前的Python版本是否是我在评论后添加的一点 class Type(type) def __new__(…, element

假设元类a需要参数。该元类的B类必须分配这些参数。假设这个类B是一个基类,这是它的IMedia派生类,它被期望分配这些参数。如果这有意义,这是否可行?如果这是没有意义的,那么为什么呢

希望这有助于理解这个问题,这里是一个具体案例的摘录,它并不假装奇妙,因为由于占位符的原因,只有相关部分显示为不严格有效的Python。请注意,此示例对Python有效 3,我不确定之前的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=…)
    …
假设函数类应该是基类,但它不是具体的。它是关于其域和编码域参数的抽象,旨在定义类型。假设没有合理的违约,以“无”或“谁知道什么”的方式提供违约,在我看来,这并不好

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

我可以用一个函数:

def function(domain, codomain):
    class Function(
            object, 
            metaclass=ArrowType, 
            domain=domain, 
            codomain=codomain)
        …
    return Function
这是可行的,但我不喜欢它,原因有多个:1函数“隐藏”在函数体中,2这不再是一个单一的基类,也不是真正的抽象类,因为它最终变成的基类与每个函数调用的从它派生的类一样多,3实例的类名按类型显示…,它们很难看


简言之,我们期望函数是抽象的,与它的domain和codomain参数有关,这些参数将在它的派生类中被赋值。

用Python实现的class语句不允许您将额外的参数传递给元类的uu init_u_u方法。无论如何,您必须更显式地调用它,而不是隐式地调用它,比如Function=ArrowType'Function',domain,codomain.@chepner,嗯,调用uuuu new_uuuuuuuuuuuuu,但是由于uu new_uuuuuuuuuu和uuu init_uuuuuuuuuuuuu通常都会得到相同的参数,所以我使用了uu init_uuuuuuuuuuuuuu。注释仍然值得,我将编辑问题,将_init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu改为_uuuuuunew_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。没有添加更多参数的语法。@chepner,可能是Python版本的问题?我使用的是Python3.4,我真正使用的是由_new__________________________________。我在问题中添加了一个关于Python版本的注释。出于某种原因,我在Python3中很难找到元类的文档。我看到类的附加关键字参数被传递到元类。