2008-11-11 4 views
11

나는 짧은 시간 동안 만 클래스를 사용하고 메소드를 작성할 때 모든 변수를 자체 참조로 만듭니다. 자기 .foo."self"는 언제 필요합니까?

그러나 wxPython in Action 책을 살펴보면서 "self"가 항상 사용되지는 않습니다. 예 :

import wx 
class TextFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, -1, 'Text Entry Example', 
      size=(300, 100)) 
     panel = wx.Panel(self, -1) 
     basicLabel = wx.StaticText(panel, -1, "Basic Control:") 
     basicText = wx.TextCtrl(panel, -1, "I've entered some text!", 
      size=(175, -1)) 
     basicText.SetInsertionPoint(0) 
     pwdLabel = wx.StaticText(panel, -1, "Password:") 
     pwdText = wx.TextCtrl(panel, -1, "password", size=(175, -1), 
      style=wx.TE_PASSWORD) 
     sizer = wx.FlexGridSizer(cols=2, hgap=6, vgap=6) 
     sizer.AddMany([basicLabel, basicText, pwdLabel, pwdText]) 
     panel.SetSizer(sizer) 

아래에는 "self"가 사용됩니다.

import wx 
class ButtonFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, -1, 'Button Example', 
      size=(300, 100)) 
     panel = wx.Panel(self, -1) 
     self.button = wx.Button(panel, -1, "Hello", pos=(50, 20)) 
     self.Bind(wx.EVT_BUTTON, self.OnClick, self.button) 
     self.button.SetDefault() 
    def OnClick(self, event): 
     self.button.SetLabel("Clicked") 

정확하게 기억한다면 "self"는 클래스의 특정 인스턴스를 참조하므로 언제 필요하지 않습니까? 엄지의 일반적인 규칙이 있습니까?

+0

속는 : http://stackoverflow.com/questions/68282/why-do-you-need-explicitly-have-the-self-argument-into-a-python-method –

+0

내가 검색 할 때 어떻게 이런 질문을 찾을 수 없습니까? 이것은 일어난 6 번째 시간과 같습니다. 링크를 제공해 주셔서 감사합니다. – crystalattice

답변

8

self.attribute을 사용하면 현재 인스턴스의 속성을 참조 할 수 있습니다.

wx.Frame.__init__()을 사용하면 상위 클래스의 메서드를 참조 할 수 있습니다. 당신은 단지 방법 (기능)의 로컬 이름 (변수)를 참조하는 경우

당신은 당신은 self를 사용하지 않습니다.

이들은 "엄지 손가락의 규칙,"하지 않은 예외가 없기 때문입니다. 아마이 특정 예에서 당신을 혼란 무엇


는 패널이 생성자 만 로컬 이름 것 ​​같다, 그래서 패널이 사라질 것 같은 당신의 생성자가 반환되면 보인다.

당신이 wx.Panel에 설명서를 보면하지만, 당신이 생성자는 부모 창에 패널을 부착 것을 볼 수 있습니다, 그래서 심지어 생성자의 복귀 후, 계속 존재할 것입니다.

매직 :

+1

+1 : "규칙"이 아닙니다. 그냥 규칙이야. –

4

self을 사용하지 않으면 해당 이름의 로컬 변수 만 만듭니다. 첫 번째 예에서는 panel이 로컬 변수로 만들어지고 나중에 함수에서 참조되지만 해당 함수 외부에서는 사용할 수 없습니다. self을 wx.Panel 생성자에 전달하는 행위는 어떤 방식으로 현재 객체와 관련되어 있으므로 함수가 반환 될 때 사라지지 않습니다.

+0

wx.Frame .__ init__ 부모 클래스 wx.Frame 메서드를 참조하십시오 – hop

+0

이 빌드하려면 인스턴스 변수 (예 : 자체 사용하지 마십시오) 로컬 변수를 선호하는 것이 좋습니다. 정말 참조를 유지해야합니다. (예 : ButtonFrame.OnClick에서 self.button을 사용함).변수 범위를 최소화하면 디버깅 및 유지 관리가 수월해집니다. –

+0

오케이. 그건 의미가 있습니다. – crystalattice

0

자체는 기본 클래스 생성자 (wx.Frame .__ init__)를 호출 할 때를 제외하고는 인스턴스 자체를 참조 할 때 항상이 필요합니다. 입니다. 예제 (panel, basicLabel, basicText, ...)에서 볼 수있는 다른 모든 변수는 현재 객체와 전혀 관련이없는 로컬 변수입니다. 메서드가 반환 될 때이 이름이 사라집니다. self.foo에있는 모든 내용은 메소드가 끝나도 유지되며 다음 메소드 (예 : self.button)에서 사용할 수 있습니다.

+0

wx.Frame .__ init__은 인스턴스를 참조하지 않으므로 예외는 아닙니다! – hop

관련 문제