2024-05-16 23:07:16 发布
网友
我在Python中遇到了这个设计模式,想知道是否有人可以解释我以前从未见过的
def func(): pass class Child(Parent, f=func): pass
不知道这里发生了什么。如果Parent有元类定义,在元类定义中它改变了类构造函数以允许传递参数,那么这个方法能起作用吗?任何帮助都是感激和抱歉的含糊不清
类定义中的额外命名参数被传递到类构造函数方法中,即元类__new__:
__new__
In [1]: class M(type): ...: def __new__(metacls, name, bases, namespace, **kwargs): ...: print(f'At metaclass, {kwargs}') ...: return super().__new__(metacls, name, bases, namespace) ...: In [2]: class A(metaclass=M, f="hello world"): pass At metaclass, {'f': 'hello world'}
因此,自定义元类可能会利用它,甚至在Python3.6之前。但是nPython 3.6, the ^{} addition使它变得更简单,因此非常有用,因为不需要自定义元类。在
请注意,自定义类层次结构中的__init_subclass__方法负责最终调用object.__init_subclass__,后者不接受任何命名参数。因此,如果您要创建一个使用__init_subclass__的类层次结构,那么每个这样的方法都应该在调用super().__init_subclass__之前,通过从kwargs中删除它们来“消费”其特定的参数。来自type本身的__new__和__init__方法(默认元类)只是忽略任何命名的参数。在
__init_subclass__
object.__init_subclass__
super().__init_subclass__
kwargs
type
__init__
这在python3.6中可以使用父级上的^{}。在
class Parent: def __init_subclass__(self, f, **kwargs): super().__init_subclass__(**kwargs) print(f) def func(): pass class Child(Parent, f=func): pass
输出:
类定义中的额外命名参数被传递到类构造函数方法中,即元类
__new__
:因此,自定义元类可能会利用它,甚至在Python3.6之前。但是nPython 3.6, the ^{} addition 使它变得更简单,因此非常有用,因为不需要自定义元类。在
请注意,自定义类层次结构中的
__init_subclass__
方法负责最终调用object.__init_subclass__
,后者不接受任何命名参数。因此,如果您要创建一个使用__init_subclass__
的类层次结构,那么每个这样的方法都应该在调用super().__init_subclass__
之前,通过从kwargs
中删除它们来“消费”其特定的参数。来自type
本身的__new__
和__init__
方法(默认元类)只是忽略任何命名的参数。在这在python3.6中可以使用父级上的^{} 。在
输出:
^{pr2}$相关问题 更多 >
编程相关推荐