때로는 세부 사항보다는 아이디어의 풍미를 위해 텍스트를 더 많이 읽어야합니다. 이것은 그러한 경우 중 하나입니다.
에서 링크 된 페이지 , 실시 예 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)
) 정확하지 않습니다.