相关疑难解决方法(0)

为什么类定义的metaclass关键字参数接受可调用?

背景

Python 3 文档清楚地描述了如何确定类的元类:

  • 如果没有给出base和没有明确的元类,则使用type()
  • 如果给出了显式元类并且它不是type()的实例,那么它将直接用作元类
  • 如果给出了类型()的实例作为显式元类,或者定义了基数,则使用派生最多的元类

因此,根据第二个规则,可以使用可调用来指定元类.例如,

class MyMetaclass(type):
    pass

def metaclass_callable(name, bases, namespace):
    print("Called with", name)
    return MyMetaclass(name, bases, namespace)

class MyClass(metaclass=metaclass_callable):
    pass

class MyDerived(MyClass):
    pass

print(type(MyClass), type(MyDerived))
Run Code Online (Sandbox Code Playgroud)

问题1

是元类MyClass:metaclass_callableMyMetaclass?文档中的第二条规则说,提供的可调用"直接用作元类".但是,MyMetaclass从那时起,元类似乎更有意义

  • MyClassMyDerived有类型MyMetaclass,
  • metaclass_callable 被叫一次然后看起来是不可恢复的,
  • 派生类不metaclass_callable以任何方式使用(据我所知)(他们使用MyMetaclass).

问题2

你可以用一个你不能用一个实例做的调用type吗?接受任意可调用的目的是什么?

python metaclass class python-3.x

8
推荐指数
1
解决办法
385
查看次数

标签 统计

class ×1

metaclass ×1

python ×1

python-3.x ×1