반응형
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이야기' 카테고리의 다른 글
json.dll vs flask.jsonify (0) | 2022.03.17 |
---|---|
기본 스타일시트 대응: {flex:1}의 기능은? (0) | 2022.03.17 |
VueJS 확장 구성 요소: 상위 속성 제거 (0) | 2022.03.17 |
대응 라우터를 사용하여 사이드바 유지 (0) | 2022.03.17 |
Vuetify 양식 검증 재설정 (0) | 2022.03.17 |