2016-08-26 1 views
1

간단한 'edit = False'클래스에 다른 옵션을 추가해야합니다. 완전 무효화 초기화(). 내가 kivy을 위해 작성된 코드의 조각을 발견 :Python __init __() 중요한 기능을 어떻게 재정의하지 않습니까?

class TitleBox(BoxLayout): 
    def __init__(self, **kwargs): 
     # make sure we aren't overriding any important functionality 
     super(TitleBox, self).__init__(**kwargs) 

을하지만 내 목적을 위해 편집하려고 할 때이 나타납니다

: "형식 오류) 초기화은 ((주어진 3) 대부분이 개 인수에 소요"를 이 작업을 수행 할 때

def __init__(self, edit=False, **kwargs): 

:

class Person_Dialog(tkSimpleDialog.Dialog): 
    def __init__(self, edit=False, **kwargs): 
     super(Person_Dialog, self).__init__(**kwargs) 
     self.edit = edit 
+0

파이썬 2 또는 3에서이 오류가 나타나지 않습니다. 코드를 더 표시 할 수 있습니까? 어떻게 부르죠? – ritlew

+0

tkSimpleDialog.Dialog에 대해 __init__을 표시 할 수 있습니까? – bravosierra99

+0

super() .__ init__이 허용하지 않습니다 ** kwargs – bravosierra99

답변

2

은의 __init__ 서명을 감안할 때

add = Person_Dialog(root, 'Add person') 

파이썬은 인스턴스를 생성하고이를 self 인수에 지정합니다. 그런 다음 edit 인수에 root을 지정합니다. 그런 다음 'Add a person'이 필요하며 다른 위치는입니다.

는이 __init__에 또 다른 인수를 추가 해결하려면 : tkSimpleDialog.Dialog이 서명 __init__(self, parent, title=None)을 가지고 있기 때문에 우리는 또한 슈퍼 클래스에 parent을 통과

class Person_Dialog(tkSimpleDialog.Dialog): 
    def __init__(self, parent, edit=False, **kwargs): # added parent argument 
     super(Person_Dialog, self).__init__(parent, **kwargs) 
     self.edit = edit 

참고.

tkSimpleDialog.Dialog은 이전 스타일 클래스이며 이전 스타일 클래스에는 super()을 사용할 수 없으므로 불행히도 코드가 TypeError: must be type, not classobj으로 실패합니다. (당신이 거기에이 문제가되지 않도록 파이썬 3는 이전 스타일 클래스와 멀리한다.) 그래서

이 슈퍼 클래스에 직접 참조 super()에 전화를 대체 해결 : 이제

class Person_Dialog(tkSimpleDialog.Dialog): 
    def __init__(self, parent, edit=False, **kwargs): 
     # referencing the superclass directly 
     tkSimpleDialog.Dialog.__init__(self, parent, **kwargs) 
     self.edit = edit 

코드가 작동합니다.

관련 문제