Programing

Python 수퍼()가 TypeError를 발생시킴

c10106 2022. 4. 1. 19:54
반응형

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

반응형