python中元类的特殊用法

时间:2014-05-27 01:47:12

标签: python class metaclass

我正在搞乱python元类,我发现了一些非常有趣的东西,我不知道它是否存在或是否有效:

class Meta(type):
    def __new__(metacls, name, bases, kwargs, extra_thing=None):
        if extra_thing is not None:
            print(extra_thing)
        return super().__new__(metacls, name, bases, kwargs)
    def __init__(metacls, name, bases, kwargs, *args, **kwargs_):
        super().__init__(metacls, name, bases, kwargs)

class TestClass(metaclass=Meta, extra_thing='foo'):
    pass

当你运行它时,' foo'打印出来。

显然,如果类的元类允许,类可以有额外的关键字参数。

如果发现此功能可能有用的场景,是否可以利用它?或者是否应该单独使用其他方法(例如定义类宽变量extra_thing)?

1 个答案:

答案 0 :(得分:2)

行为是documented,因此使用它可能是安全的,如果对其他程序员来说可能会让您感到困惑。以下是文档的说法:

  

在类定义中指定的任何其他关键字参数都将传递给下面描述的所有元类操作。

它描述的“操作”是__prepare__并调用元类本身(通常会调用元类的__new__和/或__init__方法。)