我正在尝试创建一个传递参数x
的函数并返回一个新类C
。 C
应该是固定基类A
的子类,只有一个添加:添加了某个类属性并设置为等于x
。
换句话说:
class C(A):
C.p = x # x is the parameter passed to the factory function
这很容易吗?我应该注意哪些问题?
答案 0 :(得分:14)
首先,请注意术语“类工厂”在Python中有点过时了。它用于像C ++这样的语言,用于返回类的动态类型实例的函数。它有一个名字,因为它在C ++中脱颖而出;这种情况并不罕见,但为模式命名是很有用的。然而,在Python中,这是不断完成的 - 这是一个基本的操作,任何人都不会为它赋予一个特殊的名字。
另外,请注意类工厂返回类的实例 - 而不是类本身。 (同样,那是因为它来自像C ++这样的语言,它没有返回类只有对象的概念。)但是,你说你想要返回“一个新类”,而不是一个类的新实例。
创建一个本地类并返回它是微不足道的:
def make_class(x):
class C(A):
p = x
return C
答案 1 :(得分:8)
type函数有一个3参数版本,可以动态构造一个新类。传递名称,基础和包含该类属性和方法的 dict 。
在你的情况下:
def class_factory(x):
return type("C", (A,), {"p": x})
您显然可以动态设置类的名称“C
”,但请注意,为了使类可公开访问,您还需要将函数的结果分配给变量。您可以使用globals()["C"] = ...
动态地执行此操作,或将类分配给字典,无论如何。