때로는 세부 사항보다는 아이디어의 풍미를 위해 텍스트를 더 많이 읽어야합니다. 이것은 그러한 경우 중 하나입니다.
에서 링크 된 페이지 , 실시 예 2.5, 2.6 및 2.7의 모든 이용해야 하나의 방법 do_your_stuff. (즉, do_something로 변경해야합니다 do_your_stuff.)
로 또한, 네드 Deily 지적 , A.do_your_stuff클래스 메서드이어야한다.
class A(object):
@classmethod
def do_your_stuff(cls):
print 'This is A'
class B(A):
@classmethod
def do_your_stuff(cls):
super(B, cls).do_your_stuff()
B.do_your_stuff()
super(B, cls).do_your_stuff바인딩 된 메서드를
반환합니다 ( 각주 2 참조 ). 이후 cls두 번째 인수로 전달하는 super(), 그것은이다 cls그가 반환 된 방법에 바인딩됩니다. 즉, 클래스 A cls의 메서드 do_your_stuff()에 첫 번째 인수로 전달됩니다 .
반복하려면 super(B, cls).do_your_stuff()원인 A의 do_your_stuff와 메서드가 호출되는 cls첫 번째 인수로 전달. 작업에 해당 위해서는, A의는
do_your_stuff클래스 메소드이어야합니다. 링크 된 페이지는 그것을 언급하지 않지만 확실히 그렇습니다.
추신. do_something = classmethod(do_something)classmethod를 만드는 오래된 방법입니다. 새로운 (er) 방법은 @classmethod 데코레이터를 사용하는 것입니다.
참고 super(B, cls)로 교체 할 수 없습니다 super(cls, cls). 그렇게하면 무한 루프가 발생할 수 있습니다. 예를 들면
class A(object):
@classmethod
def do_your_stuff(cls):
print('This is A')
class B(A):
@classmethod
def do_your_stuff(cls):
print('This is B')
super(cls, cls).do_your_stuff()
class C(B):
@classmethod
def do_your_stuff(cls):
print('This is C')
super(cls, cls).do_your_stuff()
C.do_your_stuff()
올릴 것 RuntimeError: maximum recursion depth exceeded while calling a Python object입니다.
경우 cls입니다 C다음, super(cls, cls)검색 C.mro()후 오는 클래스 C.
In [161]: C.mro()
Out[161]: [__main__.C, __main__.B, __main__.A, object]
클래스이기 때문에 B경우에, cls이다 C, super(cls, cls).do_your_stuff() 항상 호출 B.do_your_stuff. super(cls, cls).do_your_stuff()내부 B.do_your_stuff에서 호출 되기 때문에 B.do_your_stuff무한 루프에서 호출하게 됩니다.
Python3에서는의 0 인수 형식super 이 추가되어 super(B, cls)으로 대체 될 수 있으며 super()Python3은 컨텍스트 super()에서의 정의 class B에서 super(B, cls).
그러나 어떤 상황에서도 super(cls, cls)(또는 비슷한 이유로 super(type(self), self)) 정확하지 않습니다.