2014-10-20 2 views
1

나는 파이썬에서 초보자입니다. 이것은 상속을 보여주는 간단한 프로그램입니다. 오류가 무엇인지 판단하려면 수 없습니다. 도움이 필요하다 .파이썬 상속 간단한 문제

class games(): 
    def __init__(self): 
     self.someattri = 100 

class soccer(games): 
    def __init__(self): 
     super(soccer).__init__() 

s = soccer() 
print s.someattri 

오류 :

Traceback (most recent call last): 
    File "/Users/sam/Desktop/Desktop/python/files.py", line 9, in <module> 
    s = soccer() 
    File "/Users/sam/Desktop/Desktop/python/files.py", line 7, in __init__ 
    super(soccer).__init__() 
TypeError: must be type, not classobj 
+1

'super (soccer, self) .__ init __()'이어야하며'games'는'object'를 상속해야합니다. – jonrsharpe

+0

이것은 효과가 있습니다! 감사 –

답변

1

문제는 class games()를 작성하여, 사용자가 명시 적으로 대신 새로운 스타일의 클래스로, 이전 스타일 클래스를 만들 파이썬을 요청했습니다 있다는 것입니다. 구식 클래스에는 super을 사용할 수 없습니다.

해결책은 그렇게하지 않는 것입니다. class games(object)을 작성하여 새로운 스타일의 클래스를 만드십시오.

그러면 첫 번째 오류가 발생하지만 두 번째 오류가 발생합니다. super은 두 개의 인수 인 유형과 self 인스턴스를 취합니다. 따라서 super(soccer, self).__init__()이 필요합니다. type는 새로운 스타일의 클래스의 유형 (사용자 정의 메타 클래스없이) 동안


오류 메시지가 조금 비밀 - you'd classobj은 오래된 스타일 클래스의 타입이라고 알고있다이다 그것을 이해하고 그것을 이해하는 사람은 처음에는이 질문을하지 않았을 것입니다 ... 그러나 이것은 사람들이 더 나은 것을 배우게하지 않고 오류 메시지로 설명하기 어려운 종류의 것으로 밝혀졌습니다 배우지 않는 것. 그래서 궁극적으로 파이썬은 구식 클래스를 완전히 제거함으로써 문제를 해결했습니다. 파이썬 3.0 이상을 사용했다면, 첫 번째 문제는 존재하지 않을 것입니다. (두 번째 문제는 더 간단하게 쓸 수 있습니다. super().__init__()).


당신은 이전 스타일과 새로운 스타일의 클래스에 대한 자세한 내용을 알고 싶다면, 2.2 문서에서 Unifying types and classes 여전히 귀도의 블로그에서 가장 상세한 설명 및 The Inside Story on New-Style Classes입니다 가장 배경을 제공합니다.

그러나 실제로, 당신은 그런 것들을 알 필요가 없습니다.

  • 업그레이드 3.0 이상 : 당신이 알 필요가있는 이전 스타일의 클래스는 역사적 이유가있다, 당신은 그들과 거래를하고 싶지 않아, 그래서 당신은 다음 중 하나를 수행해야한다는 것입니다.
  • 항상 class Foo: 또는 class Foo(): 대신 class Foo(object):을 써주세요.