在python hook __prepare__中使用** kwargs

时间:2018-10-01 04:28:31

标签: python-3.x metaclass

我无法从python文档中了解如何利用钩子__prepare__的kwarg。

  

通过执行类主体填充了类名称空间后,将通过调用metaclass(name, bases, namespace, **kwds)创建类对象(此处传递的其他关键字与传递给 prepare 的那些关键字相同)

那么这意味着在填充类名称空间之后,我们可以使用这些关键字参数来添加可用于该类的额外属性吗?如果是,那么我们将如何以及在何处传递值给它,以便根据某种条件使用不同的属性填充它,例如,在隐式填充类名称空间之后,对__prepare__的调用将被隐含。

1 个答案:

答案 0 :(得分:2)

您可以从class语句将关键字参数传递给元类构造函数。除了用熟悉的Python的晦涩功能打动人们之外,它并没有什么用。

关键字会传递给__prepare____new____init__,尽管如果您仅覆盖__new__,则__init____prepare__都不会会抱怨意外的额外争论。

class Meta(type):
    def __new__(cls, name, bases, namespace, **kwargs):
        print("Got keywords in __new__: {}".format(kwargs))
        return super().__new__(cls, name, bases, namespace)

    def __prepare__(name, bases, **kwargs):
        print("Got keywords in __prepare__: {}".format(kwargs))
        return {}

class Klass(metaclass=Meta, key1=1, key2="fred"):                   # keywords used here!!!!
    pass

您无需使用**kwargs语法即可捕获参数。您可以根据需要明确命名它们(尽管它们只能作为关键字而不是位置参数来传递)。