在自定义类中更改对象属性(Python)

时间:2013-09-05 20:21:38

标签: python oop attributes tkinter

我试图通过在其类上调用方法来更改python变量。我的实际代码比下面的代码复杂得多,但下面说明了这个问题。我理解自我意味着有问题的类的实例,所以我想只需要自我。= 5或任何可行的。但事实并非如此。

我确信我错过了一些非常明显的东西。我刚刚进入Python课程,这一切看起来都相当简单,我多年前就记得OOP,但经过几个小时尝试不同的事情,谷歌搜索各种各样的短语,我仍然卡住了。我正在使用Python 2.7。

from Tkinter import *

class mylistbox(Listbox):
    def __init__(self, *args, **kwargs):
        Listbox.__init__(self, *args, **kwargs)
        self.val = 2    # setting val in this instance to 2

    def change(self, newval): #in my real code this method does a lot more
        self.val = newval # this doesn't change val in this instance!
        print "self.val is now " + str(self.val)

def callback(x):
    print x

top = Tk()

listbox = mylistbox(top)
listbox.pack()

b = Button(top, text="change", command = lambda zzz=7: listbox.change(zzz))
b.pack()
b = Button(top, text="answer", command = lambda myval=listbox.val: callback(myval))
b.pack()

top.mainloop()

如果我点击答案,更改,然后回答,我得到的输出是......

  • 2
  • self.val现在是7
  • 2

2 个答案:

答案 0 :(得分:2)

在定义时评估lambda默认值listbox.val。所以,如果你使用

lambda myval=listbox.val: callback(myval)

然后myval的默认值永远等于2。

相反,您可以使用

b = Button(top, text="answer", 
           command=lambda mybox=listbox: callback(mybox.val))

答案 1 :(得分:2)

实际上,它正在改变就好了!问题与你的班级无关;这是造成它的第二个lambda。 Python中的默认值是在创建函数时计算的,而不是在调用它时:myval的默认值在创建lambda时绑定到listbox.val的值,并且不会更改否重要的是listbox

如果您将lambda更改为lambda box=listbox: callback(box.val),则更改将会显示。