Python 3:类“模板”(返回参数化类的函数)

26 投票
2 回答
19200 浏览
提问于 2025-04-16 10:59

我想创建一个函数,这个函数接收一个参数 x,然后返回一个新的类 C。这个 C 类应该是一个固定的基类 A 的子类,唯一的不同是:它多了一个类属性,这个属性的值等于 x

换句话说:

class C(A):
  C.p = x # x is the parameter passed to the factory function

这样做简单吗?有没有什么问题是我需要注意的?

2 个回答

12

type 函数有一个可以接受三个参数的版本,它可以动态地创建一个新的类。你需要传入类的 名称基类 和一个 字典,这个字典里包含了类的属性和方法。

在你的例子中:

def class_factory(x):
    return type("C", (A,), {"p": x})

你当然可以动态地设置这个类的名称为 "C",但是要注意,为了让这个类可以被外部访问,你还需要把这个函数的结果赋值给一个变量。你可以使用 globals()["C"] = ... 这种方式动态赋值,或者把类赋值给一个字典,随你喜欢。

28

首先要注意,“类工厂”这个词在Python中有点过时了。这个词在C++等语言中用得比较多,指的是一个函数,它返回一个动态类型的类实例。之所以有这个名字,是因为在C++中这个概念比较突出;虽然不算特别常见,但给这个模式起个名字还是有用的。不过在Python中,这种操作非常常见,已经成为基本操作,所以没人再特意给它起个名字了。

另外要说明的是,类工厂返回的是类的实例,而不是类本身。(这也是因为C++没有返回类的概念,只有对象。)不过你提到你想返回的是“一个新类”,而不是一个新类的实例。

创建一个本地类并返回它是非常简单的:

def make_class(x):
    class C(A):
        p = x
    return C

撰写回答