[python] super ()가 오류와 함께 실패 : TypeError 부모가 객체를 상속하지 않으면 “인수 1은 classobj가 아니라 형식이어야합니다”

알아낼 수없는 오류가 발생합니다. 샘플 코드에 어떤 문제가 있습니까?

class B:
    def meth(self, arg):
        print arg

class C(B):
    def meth(self, arg):
        super(C, self).meth(arg)

print C().meth(1)

‘super’내장 메소드의 도움으로 샘플 테스트 코드를 얻었습니다.

오류는 다음과 같습니다.

Traceback (most recent call last):
  File "./test.py", line 10, in ?
    print C().meth(1)
  File "./test.py", line 8, in meth
    super(C, self).meth(arg)
TypeError: super() argument 1 must be type, not classobj

참고로, 다음은 파이썬 자체의 도움 (슈퍼)입니다.

Help on class super in module __builtin__:

class super(object)
 |  super(type) -> unbound super object
 |  super(type, obj) -> bound super object; requires isinstance(obj, type)
 |  super(type, type2) -> bound super object; requires issubclass(type2, type)
 |  Typical use to call a cooperative superclass method:
 |  class C(B):
 |      def meth(self, arg):
 |          super(C, self).meth(arg)
 |



답변

문제는 클래스 B가 “새 스타일”클래스로 선언되지 않았다는 것입니다. 다음과 같이 변경하십시오.

class B(object):

작동합니다.

super()모든 서브 클래스 / 슈퍼 클래스는 새로운 스타일의 클래스에서만 작동합니다. (object)클래스 정의에 항상 새 스타일 클래스가되도록 입력하는 습관을들이는 것이 좋습니다 .

구식 클래스 ( “클래식”클래스라고도 함)는 항상 유형입니다 classobj. 새 스타일 클래스는 유형 type입니다. 이것이 바로 오류 메시지가 나타난 이유입니다.

TypeError: super() argument 1 must be type, not classobj

이것을 직접보십시오 :

class OldStyle:
    pass

class NewStyle(object):
    pass

print type(OldStyle)  # prints: <type 'classobj'>

print type(NewStyle) # prints <type 'type'>

Python 3.x에서 모든 클래스는 새로운 스타일입니다. 여전히 구식 클래스의 구문을 사용할 수 있지만 새로운 스타일의 클래스를 얻게됩니다. 따라서 Python 3.x에서는이 문제가 없습니다.


답변

또한 클래스 B를 변경할 수없는 경우 다중 상속을 사용하여 오류를 수정할 수 있습니다.

class B:
    def meth(self, arg):
        print arg

class C(B, object):
    def meth(self, arg):
        super(C, self).meth(arg)

print C().meth(1)


답변

파이썬 버전이 3.X라면 괜찮습니다.

파이썬 버전이 2.X라고 생각합니다.이 코드를 추가하면 슈퍼가 작동합니다.

__metaclass__ = type

그래서 코드는

__metaclass__ = type
class B:
    def meth(self, arg):
        print arg
class C(B):
    def meth(self, arg):
        super(C, self).meth(arg)
print C().meth(1)


답변

파이썬 2.7을 사용할 때 게시 된 문제에 직면했습니다. 파이썬 3.4에서 매우 잘 작동합니다.

파이썬 2.7에서 작동하게하려면 __metaclass__ = type프로그램 상단에 속성을 추가하고 작동했습니다.

__metaclass__ : 구식 수업과 새로운 스타일 수업에서 쉽게 전환 할 수 있습니다.


답변