Python 3:类“模板”(返回参数化类的函数)
我想创建一个函数,这个函数接收一个参数 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