복붙노트

[PYTHON] Python super ()가 TypeError를 발생시킵니다.

PYTHON

Python super ()가 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

클래스 X를 클래스 X (객체)로 바꾸면 작동 할 것입니다. 이것에 대한 설명은 무엇입니까?

해결법

  1. ==============================

    1.그 이유는 super ()가 new-style 클래스에서만 작동하기 때문입니다. 2.x 시리즈에서는 object에서 확장된다는 것을 의미합니다.

    그 이유는 super ()가 new-style 클래스에서만 작동하기 때문입니다. 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
    
  2. ==============================

    2.또한 super ()를 사용하지 않는 한 super ()를 사용하지 마십시오. 새로운 스타일의 수업으로 할 수있는 범용 "옳은 일"이 아닙니다.

    또한 super ()를 사용하지 않는 한 super ()를 사용하지 마십시오. 새로운 스타일의 수업으로 할 수있는 범용 "옳은 일"이 아닙니다.

    여러 차례의 상속이 필요할 것으로 예상되는 경우가있을 수 있지만 MRO의 털이 세부 사항을 알기 전까지는 혼자있는 그대로 두어야합니다.

     X.a(self)
    
  3. ==============================

    3.위의 답변 중 어느 것도 명확하게 언급하지 않은 경우. 부모 클래스는 "object"를 상속해야합니다.이 클래스는 본질적으로 새로운 스타일 클래스로 바꿀 것입니다.

    위의 답변 중 어느 것도 명확하게 언급하지 않은 경우. 부모 클래스는 "object"를 상속해야합니다.이 클래스는 본질적으로 새로운 스타일 클래스로 바꿀 것입니다.

    # 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
    
  4. ==============================

    4.나는 다양한 X.a () 메소드를 시도했다. 그러나, 그들은 ()을 수행하기 위해 X의 인스턴스를 요구하는 것처럼 보였으므로 X (). (self)는 이전 답변보다 더 완벽하게 보였습니다. 불필요한 건설 및 파괴가 있기 때문에 문제를 다루는 좋은 방법이 아닌 것처럼 보이지만 잘 작동합니다.

    나는 다양한 X.a () 메소드를 시도했다. 그러나, 그들은 ()을 수행하기 위해 X의 인스턴스를 요구하는 것처럼 보였으므로 X (). (self)는 이전 답변보다 더 완벽하게 보였습니다. 불필요한 건설 및 파괴가 있기 때문에 문제를 다루는 좋은 방법이 아닌 것처럼 보이지만 잘 작동합니다.

    내 특정 응용 프로그램은 파이썬의 cmd.Cmd 모듈이었습니다.이 모듈은 어떤 이유로 든 NewStyle 객체가 아닙니다.

    최종 결과:

    X().a(self)
    
  5. from https://stackoverflow.com/questions/489269/python-super-raises-typeerror by cc-by-sa and MIT license