Python 从字符串列表生成类名

Python 从字符串列表生成类名,python,Python,我在Tkinter中对Frame和Label进行子类化,以便自动.pack()它们(这只是一个用法示例,我的问题与Tkinter没有严格的关系)。除标签外,两个类别的定义相同: class Frame(tk.Frame): def __init__(self, parent, **kwargs): objparams, packparams = dispatch_parameters(self, **kwargs) tk.Frame.__init__(se

我在
Tkinter
中对
Frame
Label
进行子类化,以便自动
.pack()
它们(这只是一个用法示例,我的问题与Tkinter没有严格的关系)。除标签外,两个类别的定义相同:

class Frame(tk.Frame):
    def __init__(self, parent, **kwargs):
        objparams, packparams = dispatch_parameters(self, **kwargs)
        tk.Frame.__init__(self, parent, objparams)
        self.pack(packparams)

class Label(tk.Label):
    def __init__(self, parent, **kwargs):
        objparams, packparams = dispatch_parameters(self, **kwargs)
        tk.Label.__init__(self, parent, objparams)
        self.pack(packparams)
为了避免对这两个类重复相同的代码,我想知道如何通过改变“标签”来重用它。我知道上面的“
Frame
”表示类中的不同内容(一个类名,一个实际的类,…),因此我试图理解按照以下内容看是否正确(这是试图解释我的观点的伪代码)

[“框架”、“标签”]中的类名的
:
类别(tk.):
定义初始值(自、父、**kwargs):
objparams,packparams=调度参数(self,**kwargs)
tk..\uuuu初始化(自、父、对象参数)
自包装(包装参数)
对于这种代码重用的情况,是否有一种pythonic方法?或者我应该坚持一个接一个地定义类,即使代码非常相似

注1:我认为这个问题与


注2:我故意省略了
tkinter
标记,因为我给出的示例只是一般情况的一个特定实例

您可以使用以下命令动态创建类:

当给定3个参数时,
type()
函数将根据这些参数生成一个类。第一个参数是名称,第二个参数是基类的元组,第三个参数是表示类主体的映射

这里需要使用
对象
基来处理
Tkinter
模块中的旧式类

另一个选项是在函数中定义
语句的范围:

def class_factory(classname):
    base_class = getattr(tk, classname)

    class CustomClass(base_class):
        def __init__(self, parent, **kwargs):
            objparams, packparams = dispatch_parameters(self, **kwargs)
            base_class.__init__(self, parent, objparams)
            self.pack(packparams)

    CustomClass.__name__ = classname
    return CustomClass

在这里,我们不必混合使用
对象
基类。

它可能类似于吗?@bvidal:的确,很好的发现。啊,我的方法和
Tkinter
模块中的旧式类似乎有问题;这实际上不适用于旧式类(
type()
在这里抛出异常)。我正在调查解决方案。第二个方案非常有效,谢谢。
def class_factory(classname):
    base_class = getattr(tk, classname)

    def __init__(self, parent, **kwargs):
        objparams, packparams = dispatch_parameters(self, **kwargs)
        base_class.__init__(self, parent, objparams)
        self.pack(packparams)

    return type(classname, (base_class, object), {'__init__': __init__})

for classname in ["Frame", "Label"]:
    globals()[classname] = class_factory(classname)
def class_factory(classname):
    base_class = getattr(tk, classname)

    class CustomClass(base_class):
        def __init__(self, parent, **kwargs):
            objparams, packparams = dispatch_parameters(self, **kwargs)
            base_class.__init__(self, parent, objparams)
            self.pack(packparams)

    CustomClass.__name__ = classname
    return CustomClass