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 X
에 class 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)