我有一个班级,称之为Test
,其中有一个变量var
。它在__init__
mathod中使用此变量,可能看起来像这样:
class Test(object):
var = 0
def __init__(self):
print(self.var)
为了在初始化类之前更改此变量,这似乎是合乎逻辑的
test = Test
test.var = 42
test.__init__(test)
......并且表现得像我预期的那样。 (打印42
)
但是,当代码看起来像这样:
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
...它在canvas.__init__
行引发错误,抱怨
TypeError: _options() missing 1 required positional argument: 'cnf'
我怀疑这是cnf参数的一个问题,因为这个类在“正常”调用时工作正常,就像在test = Test()
中一样。我感觉参数的传递方式不同。
有人可以解释一下吗?
提前致谢
答案 0 :(得分:1)
您似乎对python类的工作方式存在误解。
在您的代码中,您正在执行test = Test
,除了让test
指向班级Test
之外什么也不做。它不创建Test
的实例。
如果要更改类值的值,则无需先对临时变量进行赋值。例如。要创建一个var
设置为零的类,然后您想将其更改为42,您可以这样做:
class Test(object):
var = 0
...
Test.var = 42
此外,除非在使用子类的__init__
调用超类的函数时,否则不应直接调用__init__
。相反,您创建了一个类的实例,它将自动为您调用__init__
:
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)
请注意,因为这是一个类变量,所以更改它一次将为所有实例更改它。