반응형
Python 수퍼()가 TypeError를 발생시킴
Python 2.5에서 다음 코드는TypeError
:
>>> class X:
def a(self):
print "a"
>>> class Y(X):
def a(self):
super(Y,self).a()
print "b"
>>> c = Y()
>>> c.a()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in a
TypeError: super() argument 1 must be type, not classobj
교체할 경우class X
함께,class X(object)
그건 작동할 것이다.이에 대한 설명은?
그 이유는 2.x 시리즈는 에서 확장되는 것을 의미하는 새로운 스타일의 수업에서만 운영되기 때문이다.object
:
>>> class X(object):
def a(self):
print 'a'
>>> class Y(X):
def a(self):
super(Y, self).a()
print 'b'
>>> c = Y()
>>> c.a()
a
b
게다가, 꼭 써야 할 경우가 아니라면, 수퍼()를 사용하지 마라.의심할 만한 새로운 스타일의 수업을 하는 것은 범용적인 "올바른 일"이 아니다.
여러 번 유산을 기대하고 있을 때도 있고 원할 수도 있지만, MRO의 털털한 세부 사항을 알기 전까지는 그냥 내버려두고 다음을 고수하는 것이 좋다.
X.a(self)
위의 답변 중 명확하게 언급된 답변이 없을 경우.당신의 부모 클래스는 본질적으로 새로운 스타일의 클래스로 바꿀 "객체"로부터 물려받을 필요가 있다.
# python 3.x:
class ClassName(object): # This is a new style class
pass
class ClassName: # This is also a new style class ( implicit inheritance from object )
pass
# Python 2.x:
class ClassName(object): # This is a new style class
pass
class ClassName: # This is a old style class
pass
나는 다양한 X.a() 방법을 시도해 보았지만, a()를 수행하기 위해서는 X의 인스턴스(instance)가 필요한 것 같아, 적어도 내가 접하는 어플리케이션에 대해서는 이전 답안보다 더 완벽해 보이는 X(.a)(self)를 했다.불필요한 시공과 파괴가 있어 문제 해결에는 좋은 방법이 아닌 것 같지만 잘 작동한다.
나의 구체적인 지원서는 파이썬의 cmd였다.Cmd 모듈, 분명히 어떤 이유로 NewStyle 개체가 아닌 것 같다.
최종 결과:
X().a(self)
참조URL: https://stackoverflow.com/questions/489269/python-super-raises-typeerror
반응형
'IT이야기' 카테고리의 다른 글
왜 && 오퍼레이터가 두 번째 피연산자의 유형을 생성하는가? (0) | 2022.04.04 |
---|---|
반응 JS를 사용한 무한 스크롤 (0) | 2022.04.04 |
반응 컨텍스트 및 후크 API의 효소 오류 (0) | 2022.04.04 |
Python에서 stdout 파이핑 시 올바른 인코딩 설정 (0) | 2022.04.04 |
Vuetify에서 v-card 구성 요소의 중앙에 콘텐츠를 맞추는 방법 (0) | 2022.04.04 |