【问题标题】:How to pass class keyword arguments with the `type()` built-in function?如何使用 `type()` 内置函数传递类关键字参数?
【发布时间】: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)。

推荐的做法是什么?

【问题讨论】:

    标签: python


    【解决方案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")
    

    【讨论】:

    • 我更喜欢元类在创建类时获取正确类名的第一种方法
    猜你喜欢
    • 2021-06-17
    • 1970-01-01
    • 2017-08-01
    • 2019-12-20
    • 2016-12-13
    • 1970-01-01
    • 2019-12-01
    • 2019-08-23
    相关资源
    最近更新 更多