繁体   English   中英

python是如何确定合适的元类的?

[英]How does the python determine the appropriate metaclass?

我可能在官方文档中找到了答案,但我仍然无法得到它。 你能在第二种和第三种情况下给我更详细或更直接的解释吗? 如果你能给我一些例子,我将不胜感激!

类定义的适当元类确定如下:

  • 如果没有给出基类和显式元类,则使用type()
  • 如果给出了一个显式元类并且它不是type() 的实例,那么它被直接用作元类;
  • 如果type()的实例作为显式元类给出,或者定义了基类,则使用最派生的元类。

假设您试图通过元类(在本例中为其中两个)实现单例模式。

class Singleton(type):
    _inst = {}

    def __call__(cls, *args, **kwargs):
        return cls._inst.setdefault(cls, super().__call__(*args, **kwargs))

class Singleton2(Singleton):
    def __call__(cls, *args, **kwargs):
        return super().__call__(*args, **kwargs)



class SingletonClass1(metaclass=Singleton):
    pass


class SingletonClass2(SingletonClass1, metaclass=Singleton2):
    pass


class SingletonClass3():
    pass


class SingletonClass4(SingletonClass2, metaclass=Singleton):
    pass

type(class_obj)函数返回class_obj的元类。

所以这是你的情况:

  1. 如果没有给出基类和显式元类,则使用 type();

    type(SingletonClass3) --> <class 'type'>

2.如果给出了一个显式元类并且它不是type()的实例,那么它直接用作元类;

 `type(SingletonClass2) --> <class '__main__.Singleton2'>`

3. 如果 type() 的实例作为显式元类给出,或者定义了基类,则使用最派生的元类;

`type(SingletonClass4) --> <class '__main__.Singleton2'>`

如果你从 SingletonClass1 继承 SingletonClass2 但忘记从 Singleton 继承 Singleton2,它会导致 TypeError。

派生最多的元类是所有这些候选元类的子类型。 如果没有一个候选元类符合该标准,则类定义将因 TypeError 而失败。

更新:元类可以是函数,不是type实例,因此第二种情况(如果给出了显式元类并且它不是 type 的实例)可能与此相关。 这是元类函数的单例实现。

def singleton_func(class_name, bases, attrs):
    _inst = {}

    def custom_new(cls):
        return _inst.setdefault(cls, object.__new__(cls))

    attrs['__new__'] = custom_new
    return type(class_name, bases, attrs)


class SingletonClass5(metaclass=singleton_func):
    pass

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM