在类定义中添加参数

Mic*_*ael 7 python inheritance metaclass

我在 Python 中遇到了这个设计模式,想知道是否有人可以解释一下,因为我以前从未见过它

def func():
   pass

class Child(Parent, f=func):
   pass
Run Code Online (Sandbox Code Playgroud)

不确定这里发生了什么。如果 Parent 具有元类定义,其中它更改了类构造函数以允许传递参数,那么这可以工作吗?感谢任何帮助,并对含糊之处表示歉意

Fam*_*ous 5

这适用于__init_subclass__在父级上使用的 Python 3.6。

class Parent:
    def __init_subclass__(self, f, **kwargs):
        super().__init_subclass__(**kwargs)
        print(f)

def func():
    pass

class Child(Parent, f=func):
    pass
Run Code Online (Sandbox Code Playgroud)

输出:

<function func at 0x7f48207cae18>
Run Code Online (Sandbox Code Playgroud)


jsb*_*eno 2

类定义中的额外命名参数被传递到类构造函数方法中 - 即元类__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'}
Run Code Online (Sandbox Code Playgroud)

因此,即使在 Python 3.6 之前,自定义元类也可能会使用它。但在Python 3.6 中,__init_subclass__添加使得拥有这样的参数变得更简单,因此也更有用——因为不需要自定义元类。

请注意,__init_subclass__自定义类层次结构中的方法负责最终调用object.__init_subclass__- 它不接受任何命名参数。因此,如果您正在创建一个使用 的类层次结构,则每个此类方法都应该通过在调用 之前 __init_subclass__删除它们来“消耗”其特定参数。其自身(默认元类) 的 and方法只是忽略任何命名的参数。kwargssuper().__init_subclass____new____init__type