[python] Python super ()는 TypeError를 발생시킵니다.

Python 2.5에서 다음 코드는 a를 발생시킵니다 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 Xclass X(object), 그것은 작동합니다. 이것에 대한 설명은 무엇입니까?



답변

그 이유는 2.x 시리즈에서 다음과 같은 확장을 의미하는 새로운 스타일의 클래스super() 에서만 작동하기 때문입니다 .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


답변

또한 꼭 필요한 경우가 아니면 super ()를 사용하지 마십시오. 의심 할 수있는 새로운 스타일의 클래스와 관련된 일반적인 목적의 “올바른 일”이 아닙니다.

다중 상속을 예상하고 원하는 경우가있을 수 있지만 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


답변

다양한 Xa () 메서드를 시도했습니다. 그러나 그들은 a ()를 수행하기 위해 X의 인스턴스가 필요한 것처럼 보이므로 적어도 내가 만난 응용 프로그램에 대해서는 이전 답변보다 더 완전한 것처럼 보이는 X (). a (self)를 수행했습니다. 불필요한 건설과 파괴가 있기 때문에 문제를 처리하는 좋은 방법은 아닌 것 같지만 잘 작동합니다.

내 특정 응용 프로그램은 Python의 cmd.Cmd 모듈이었는데, 어떤 이유로 든 NewStyle 객체가 아닌 것 같습니다.

최종 결과:

X().a(self)


답변