在 class 定义中添加参数
Adding argument in class definition
我 运行 在 Python 中研究了这个设计模式,想知道是否有人可以解释一下,因为我以前从未见过它
def func():
pass
class Child(Parent, f=func):
pass
不确定这里发生了什么。如果 Parent 具有 metaclass 定义,它可以更改 class 构造函数以允许传递参数,这是否可行?感谢您的帮助,对于含糊不清的地方,我们深表歉意
这在 Python 3.6 中有效,在父级上使用 __init_subclass__
。
class Parent:
def __init_subclass__(self, f, **kwargs):
super().__init_subclass__(**kwargs)
print(f)
def func():
pass
class Child(Parent, f=func):
pass
输出:
<function func at 0x7f48207cae18>
class 定义中的额外命名参数被传递到 class 构造方法 - 即元class __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'}
因此,即使在 Python 3.6 之前,自定义元 class 也可能会利用它。但是 n Python 3.6, the __init_subclass__
addition 使拥有这样的参数变得更加简单,因此也很有用——因为不需要自定义 metaclass 。
请注意,自定义 class 层次结构中的 __init_subclass__
方法负责最终调用 object.__init_subclass__
- 它不采用任何命名参数。因此,如果您正在创建一个使用 __init_subclass__
的 class 层次结构,则每个此类方法都应该 "consume" 通过在调用 [=17= 之前从 kwargs
中删除它们来删除它们的特定参数].来自 type
本身的 __new__
和 __init__
方法(默认元 class)简单地忽略任何命名的参数。
我 运行 在 Python 中研究了这个设计模式,想知道是否有人可以解释一下,因为我以前从未见过它
def func():
pass
class Child(Parent, f=func):
pass
不确定这里发生了什么。如果 Parent 具有 metaclass 定义,它可以更改 class 构造函数以允许传递参数,这是否可行?感谢您的帮助,对于含糊不清的地方,我们深表歉意
这在 Python 3.6 中有效,在父级上使用 __init_subclass__
。
class Parent:
def __init_subclass__(self, f, **kwargs):
super().__init_subclass__(**kwargs)
print(f)
def func():
pass
class Child(Parent, f=func):
pass
输出:
<function func at 0x7f48207cae18>
class 定义中的额外命名参数被传递到 class 构造方法 - 即元class __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'}
因此,即使在 Python 3.6 之前,自定义元 class 也可能会利用它。但是 n Python 3.6, the __init_subclass__
addition 使拥有这样的参数变得更加简单,因此也很有用——因为不需要自定义 metaclass 。
请注意,自定义 class 层次结构中的 __init_subclass__
方法负责最终调用 object.__init_subclass__
- 它不采用任何命名参数。因此,如果您正在创建一个使用 __init_subclass__
的 class 层次结构,则每个此类方法都应该 "consume" 通过在调用 [=17= 之前从 kwargs
中删除它们来删除它们的特定参数].来自 type
本身的 __new__
和 __init__
方法(默认元 class)简单地忽略任何命名的参数。