我无法从python文档中了解如何利用钩子__prepare__
的kwarg。
通过执行类主体填充了类名称空间后,将通过调用
metaclass(name, bases, namespace, **kwds)
创建类对象(此处传递的其他关键字与传递给 prepare 的那些关键字相同)
那么这意味着在填充类名称空间之后,我们可以使用这些关键字参数来添加可用于该类的额外属性吗?如果是,那么我们将如何以及在何处传递值给它,以便根据某种条件使用不同的属性填充它,例如,在隐式填充类名称空间之后,对__prepare__
的调用将被隐含。
答案 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
语法即可捕获参数。您可以根据需要明确命名它们(尽管它们只能作为关键字而不是位置参数来传递)。