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:问题中的代码在创建实例之前更改变量。您的代码不会在任何地方创建实例。