如何使用`type()`内置函数传递类关键字参数?

class语句采用各种功能的关键字参数。例如,该__init_subclass__函数接收在类声明中传递的关键字参数:

class A(object):
  def __init_subclass__(cls, **kwargs):
    print(f'{kwargs=}')

class B(A, my_arg=5):
  pass
kwargs={'my_arg': 5}

但是,这样做会阻止动态类创建:该type函数似乎不采用class关键字参数。工厂函数可以,但__init_subclass__在工厂必须修改类时可能会发生冲突或类似。

我想type()在其 3 参数版本中使用内置函数来动态创建一个类。但是,似乎没有记录的方法来传递关键字参数(如my_arg前面的示例)。

推荐的做法是什么?

回答

裸语句type并不等同class于 Python3 中的语句。使用types.new_class作为一个功能等效class的语句。

class B(A, my_arg=5):
  a = 12  # non-trivial class body

B = types.new_class(
    'B',
    # base classes of `class` statement
    bases=(A,),
    # keywords to the `class` statement
    kwds={'my_arg': 5},
    # the class body as a function
    exec_body=lambda body: body.update({'a': 12}),
)

请记住,class语句始终可以包含在函数中,以允许创建参数化的函数类。这也允许设置大多数特殊属性,例如通过__qualname__以下方式设置类名:

def make_b(my_arg, my_a, name=None):
    class Parameterized_B(A, my_arg=my_arg):
        a = my_a
        if name is not None:
            __qualname__ = name
    return Parameterized_B

B = make_b(5, 12, "B")


以上是如何使用`type()`内置函数传递类关键字参数?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>