알아낼 수없는 오류가 발생합니다. 샘플 코드에 어떤 문제가 있습니까?
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__
: 구식 수업과 새로운 스타일 수업에서 쉽게 전환 할 수 있습니다.