2013-09-05 2 views
0

파이썬 변수를 클래스에서 호출하여 변경하려고합니다. 내 실제 코드는 아래보다 훨씬 복잡하지만 아래에서 문제를 보여줍니다. 나는 자아가 문제의 클래스의 인스턴스를 의미한다는 것을 이해한다. 그래서 나는 self.val = 5 또는 무엇이든지 작동 할 것이라고 생각했다. 그러나 그렇지 않습니다.커스텀 클래스 (파이썬) 내의 객체 속성 변경하기

정말 확실한 것이 빠져있을 것입니다. 저는 방금 파이썬으로 수업을 시작했습니다. 그리고 그 모든 것은 꽤 간단 해 보였습니다. 몇 년 전부터 OOP를 기억해 냈습니다.하지만 여러 가지 시도를하고 몇 가지 구어를 구사하면서 저는 여전히 붙어 있습니다. 파이썬 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

를 사용할 수 있습니다! 문제는 당신의 수업과 관련이 없습니다. 두 번째 람다가 그 원인입니다. 파이썬의 기본 값은 호출 될 때가 아니라 함수가 생성 될 때 평가됩니다. myval의 기본값은 람다가 생성 될 때 listbox.val의 값에 바인딩되며 listbox에 상관없이 변경되지 않습니다.

람다를 lambda box=listbox: callback(box.val)과 같이 변경하면 변경 사항이 표시됩니다.

+0

감사! 당신과 유부녀는 기본적으로 똑같은 말을했지만 누군가에게 받아 들여지는 대답을 주어야하고, 당신은 조금 더 빨리 대답했습니다 ... – reedstonefood

2

입니다 람다 디폴트 값 listbox.val은 정의시 평가됩니다. 당신이

lambda myval=listbox.val: callback(myval) 

를 사용하는 경우 그럼 myval의 기본값은 영원히 2와 같습니다.

대신, 사실, 잘 변화하고

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

ARGH! 아주 간단합니다. 다른 곳에서 람다 함수의 변수를 사용하고 있었으므로 객체의 속성을 호출하는 것과 관련이 있다고 생각했습니다. 적어도 내가 잘못 이해 한 것은 기본적인 OOP 이론 (이론적으로는 이해할 수있는 것)보다는 람다 함수 (아직 완전히 이해하지 못함)에있었습니다 :) 감사합니다! – reedstonefood