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

Posted

技术标签:

【中文标题】如何使用 `type()` 内置函数传递类关键字参数?【英文标题】:How to pass class keyword arguments with the `type()` built-in function? 【发布时间】:2021-07-08 09:21:36 【问题描述】:

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 关键字参数。 A factory function does,但在工厂必须修改类时可能与__init_subclass__或类似冲突。

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

推荐的做法是什么?

【问题讨论】:

【参考方案1】:

type 不等同于 Python3 中的 class 语句。将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()` 内置函数传递类关键字参数?的主要内容,如果未能解决你的问题,请参考以下文章

函数小结

函数 阶段总结

函数复习

第三篇 函数

jdk内置工具使用

Python编程入门到实践 - 笔记( 8 章)