Python 从tkinter对象继承时出现参数错误
我有一个类,叫做Python 从tkinter对象继承时出现参数错误,python,class,inheritance,tkinter,Python,Class,Inheritance,Tkinter,我有一个类,叫做Test,它有一个变量var。它在其\uuuu init\uuuu方法中使用此变量,可能看起来像这样: class Test(object): var = 0 def __init__(self): print(self.var) class Test(Canvas): var = 0 def __init__(self, parent): Canvas.__init__(self, parent)
Test
,它有一个变量var
。它在其\uuuu init\uuuu
方法中使用此变量,可能看起来像这样:
class Test(object):
var = 0
def __init__(self):
print(self.var)
class Test(Canvas):
var = 0
def __init__(self, parent):
Canvas.__init__(self, parent)
self.pack()
print(self.var)
test = Test
test.var = 42
test.__init__(test, frame) #tkinter frame I had made elsewhere
为了在初始化类之前更改这个变量,这似乎是合乎逻辑的
test = Test
test.var = 42
test.__init__(test)
…而且表现得像我预料的那样。(打印42
)但是,当代码如下所示时:
class Test(object):
var = 0
def __init__(self):
print(self.var)
class Test(Canvas):
var = 0
def __init__(self, parent):
Canvas.__init__(self, parent)
self.pack()
print(self.var)
test = Test
test.var = 42
test.__init__(test, frame) #tkinter frame I had made elsewhere
。。。它在画布上抛出一个错误
TypeError: _options() missing 1 required positional argument: 'cnf'
我怀疑这是cnf参数的问题,因为调用“正常”时该类工作正常,如test=test()
。我感觉参数的传递方式不同。
有人能给我们点启示吗?
提前感谢您似乎对python类的工作方式有误解
在代码中,您正在执行test=test
,它只会使test
指向类test
。它不会创建Test
的实例
如果要更改类值的值,无需首先对临时变量赋值。例如要创建一个将var
设置为零的类,并且以后要将其更改为42,可以通过以下方式执行:
class Test(object):
var = 0
...
Test.var = 42
此外,您不应该直接调用\uuuuu init\uuuu
,除非使用子类的\uuuu init\uuu
调用超类的函数。而是创建类的实例,该实例将自动为您调用\uuuu init\uuuu
:
test = Test()
无论您是从tkinter类还是任何其他类继承,这一切都是一样的
运行以下示例时,它将打印出42
:
import tkinter as tk
class Test(tk.Canvas):
var = 0
def __init__(self, parent):
tk.Canvas.__init__(self, parent)
self.pack()
print(self.var)
Test.var = 42
root = tk.Tk()
test = Test(root)
请注意,因为这是一个类变量,所以更改一次将更改所有实例的类变量。您认为test=test
有什么作用?不清楚你想要完成什么。你为什么打电话给\uuuuu int\uuuuu
?这是非常不寻常的。我想在初始化类之前更改类的变量,如第一个示例中所示。这是坏习惯吗?在这种情况下,更好的方法是什么?第一个变量(“self”)必须是类的实例,而不是类本身。即Test()
或Test()
的结果。当您创建实例时,会自动调用\uuuu init\uuu()
,因此您不需要它。@Jonathan“当您创建实例时”您是指测试=test
?因为那里没有打印任何内容(否则它会打印0
,而不是42
),所以我假设没有调用\uuuuu init\uuuu
,嗯,那么你认为这是错误的方法,还是有办法绕过它@乔纳森·汉克,布莱恩!是的,这就是让我困惑的地方;在创建实例之前,我没有意识到我可以更改变量。有用的回答@EriktheRed:问题中的代码在创建实例之前更改变量。您的代码不会在任何地方创建实例。