Python 如何创建一个子类来填充父对象的*args和**kwargs?

Python 如何创建一个子类来填充父对象的*args和**kwargs?,python,tkinter,subclass,args,keyword-argument,Python,Tkinter,Subclass,Args,Keyword Argument,我试图在tkinter中创建一个button子类,以便它自动填充一些arg和kwarg。我不确定这是python问题还是tkinter问题 从tkinter导入* root=Tk() 类MyButton(按钮): 定义初始化(self,*args,**kwargs): 超级(按钮)。\uuuuuuuuuuuuuuuuuuuu初始(*参数,**kwargs) kwargs={“padx”:40,“pady”:20} args=(根) 测试=数字按钮(text=“48”) test.pack() r

我试图在tkinter中创建一个button子类,以便它自动填充一些arg和kwarg。我不确定这是python问题还是tkinter问题

从tkinter导入*
root=Tk()
类MyButton(按钮):
定义初始化(self,*args,**kwargs):
超级(按钮)。\uuuuuuuuuuuuuuuuuuuu初始(*参数,**kwargs)
kwargs={“padx”:40,“pady”:20}
args=(根)
测试=数字按钮(text=“48”)
test.pack()
root.mainloop()
错误是:

回溯(最近一次呼叫最后一次):
文件“我的文件目录”,第18行,在
test=Numbutton(text=“xyz”、*args、**kwargs)
cget中的文件“my tkinter目录”,第1489行
返回self.tk.call(self._w,'cget','-'+键)
TypeError:只能将str(而不是“int”)连接到str
感谢您的帮助:)

这里是第一个尝试:

from tkinter import *

root = Tk()

class MyButton(Button):
    def __init__(self, *args, **kwargs):
        super().__init__(root, padx=40, pady=20,**kwargs)

test = MyButton(text = "48")
test.pack()
root.mainloop()
编辑:

这里有一种更好的方法可以用来使用初始kwargs而不是硬编码初始kwargs生成子类:

from tkinter import Tk, Button


def set_button_initial(*initial_args, **initial_kwargs):
    class ButtonClassWithInitialStuff(Button):
        def __init__(self, *args, **kwargs):
            super().__init__(*initial_args, **initial_kwargs, **kwargs)
    return ButtonClassWithInitialStuff


root = Tk()

ButtonClass1 = set_button_initial(root, {"padx": 40, "pady": 20})
ButtonClass2 = set_button_initial(root, {"padx": 10, "pady": 50})

ButtonObject1a = ButtonClass1(text="48")
ButtonObject1b = ButtonClass1(text="49")
ButtonObject2 = ButtonClass2(text='second')
ButtonObject1c = ButtonClass1(text="50")

ButtonObject1a.pack()
ButtonObject1b.pack()
ButtonObject2.pack()
ButtonObject1c.pack()

root.mainloop()
注意,对于函数set_button_initial,我们返回类ButtonClassWithInitialStuff,而不是对象ButtonClassWithInitialStuff(),也就是说,我们设置了构造函数(init),但还没有使用它

使用该函数,我们创建了ButtonClass1和ButtonClass2类

然后,我们实例化刚刚创建的类的obejcts ButtonObject1a-c和ButtonObject1。注意:我们可以重用这些类来创建任意多的对象,而无需重新调用set_button_initial

(编辑以解释评论者提出的问题)

据我所知@mistermiagi建议使用

from functools import partial

def set_button_initial(*initial_args, **initial_kwargs):
    return partial(Button, *initial_args, **initial_kwargs)

它的行为似乎相同,但外观更好,不会丢失信息,因此更好

您的代码显示
test=Numbutton(text=“48”)
,但您的错误显示
test=Numbutton(text=“xyz”、*args、**kwargs)
。代码中的任何地方都没有定义
Numbutton
。请提供一个。与其在每次调用时创建和返回一个新类,
set_button_initial
可以
返回部分(button,*initial_args,**initial_kwargs)
。我不明白为什么你的“better”方法实际上更好。“better”方法接受初始kwargs而不是硬编码,因此,您可以使用单个函数传递不同的KWARG来定义多个不同的预加载类