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

时间:2011-02-01 02:28:06

标签: python python-3.x class-design factory-pattern

我正在尝试创建一个传递参数x的函数并返回一个新类CC应该是固定基类A的子类,只有一个添加:添加了某个类属性并设置为等于x

换句话说:

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

这很容易吗?我应该注意哪些问题?

2 个答案:

答案 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"] = ...动态地执行此操作,或将类分配给字典,无论如何。