2011-03-18 59 views
30

我有一个创建从它的参数派生类的函数:如何动态设置类名?

def factory(BaseClass) : 
    class NewClass(BaseClass) : pass 
    return NewClass 

现在,当我用它来创建新的类,这些类都被命名为相同的,实例看起来像他们具有相同的类型:

NewA = factory(ClassA) 
NewB = factory(ClassB) 
print type(NewA()) # <class __main__.NewClass> 
print type(NewB()) # <class __main__.NewClass> 

正确修复手动设置__name__属性?

NewA.__name__ = 'NewA' 
print type(NewA()) # <class __main__.NewA> 

我还有什么其他的事情需要设置吗?

回答

34

是的,设置__name__是正确的做法;你不需要设置其他任何东西来调整类名。

例如:

def factory(BaseClass) : 
    class NewClass(BaseClass): pass 
    NewClass.__name__ = "factory_%s" % BaseClass.__name__ 
    return NewClass 

type错误的事情在这里使用。它不允许您使用Python的普通类语法定义类,而是让您手动设置每个类属性。它用于手动创建类,例如。如果你有一个基类的数组,并且你想用它创建一个类(你不能用Python的类语法来做)。不要在这里使用它。

7

使用具有三个参数的type()函数检出。以下代码创建一个新类“NewA”,其中object作为基本类型,并且没有初始属性。

>>> type('NewA', (object,), {}) 
<class '__main__.NewA'> 
+0

如果NewClass中的类定义非常长,看起来有点笨重。我将不得不将所有的方法累加到一个字典中(我假设doc字符串也在那里,在'__doc __'''下)。 – kiyo 2011-03-18 14:24:55

+0

还有,如果NewClass中的方法必须动态引用BaseClass的方法呢? – kiyo 2011-03-18 14:34:51

+0

'type'用于创建具有可变基本列表的类;这完全是错误的工具。 – 2011-03-18 14:40:55