如何使用 `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()` 内置函数传递类关键字参数?的主要内容,如果未能解决你的问题,请参考以下文章