2012-12-07 4 views
0
class Example(wx.Frame): 

    def __init__(self, *args, **kwargs): 
     super(Example, self).__init__(*args, **kwargs) 

     self.InitUI() 

    def InitUI(self):  

     menubar = wx.MenuBar() 
     fileMenu = wx.Menu() 
     viewMenu = wx.Menu() 

     self.shst = viewMenu.Append(wx.ID_ANY, 'Show statubar', 
      'Show Statusbar', kind=wx.ITEM_CHECK) 
... 

저는 최근에 파이썬과 wxPython을 배우기 시작했습니다. 위 코드는 http://www.zetcode.com/wxpython/menustoolbars/입니다. self.shst 변수에 머리를 쓰려고합니다. self 키워드를 접두어로 사용해야하는 이유는 무엇입니까? 내가 무엇을 읽고, 자기 키워드가 인스턴스 변수를 "선언"을, __init__ 메쏘드에서 그 문맥에서 사용하지만, 저자는 빛에 __init__함수 본문에서 파이썬 변수 "선언"

편집 에는 shst 선언을주지 않습니다에서

class Test(object): 
    def __init__(self): 
     self.x = 20 
    def func(self): 
     self.y = 10 
    def getVal(self): 
     return self.y 


def main(): 
    t = Test() 
    print t.getVal() 
    print dir(t) 

if __name__ == '__main__': 
    main() 

내가 GETVAL() 함수에 self.y로 액세스 할 수 없습니다입니다, 나는 디렉토리 (t)의 출력에 Y가 표시되지 않습니다 답의 I는 다음의 시험을했다. Test 클래스의 모든 함수에 self.y 액세스 할 수 없습니까?

답변

1

shst의 접두어가 self. 인 경우 범위를 벗어나 메소드가 종료 된 후에 가비지 수집되는 로컬 변수 일뿐입니다. 할당 전에 파이썬 클래스/객체 멤버를 선언 할 필요가 없습니다.

+0

내 수정 사항에 댓글을 달 수 있습니까? –

+1

당신은'y' 속성을 생성하는't.func()'를 호출하지 않았습니다. – tehwalrus

+0

아, 이제 알겠습니다. 파이썬의 위험한 버릇처럼 보입니다. 고마워요! –

1

__init__에 인스턴스 변수를 정의 할 필요는 없습니다. 그들은 어디에서나 정의 될 수 있습니다. 파이썬은 역동적 인 언어이며 언제든지 객체에 속성을 추가 할 수 있습니다.

+2

그러나 사용 된 변수를'__init__'에 정의하는 것이 좋지 않습니다. 왜냐하면 클래스에 사용 된 모든 내부 변수를 한 함수에서 볼 수 있기 때문입니다. – Alex

+0

@Alex 사실, 그렇다고 강요 당하지는 않습니다. – delnan