2012-03-29 6 views
3

즉, MyClass 클래스가 있고 super (MyClass)를 수행하면됩니다. 초기화, 어떤 클래스의 초기화 실제로 호출 될지 어떻게 알 수 있습니까? 파이썬에서 슈퍼 객체가 어떤 클래스에 래핑하는지 어떻게 알 수 있습니까?

일부 코드

는 설명하기 :

class MyClass(OtherClass, ThirdClass): 
    def __init__(self): 
     mySuper = super(MyClass) 
     if mySuper == SomeClass: 
      # doesn't work - mySuper is a super object (not a normal class object) 
      pass 
     if mySuper.__init__ == SomeClass.__init__: 
      # doesn't work - mySuper.__init__ is a super-method-wrapper object 
      pass 
     if mySuper.__thisclass__ == SomeClass: 
      # doesn't work - __thisclass__ is set to be MyClass, not the "parent" class 
      pass 

어떤 아이디어?

+0

다중 상속을 사용할 때 슈퍼 클래스 '__init__'에'* args'와'** kwargs'를 전달할 수 있습니다. 슈퍼 클래스'__init__'는 원하는 인수를 추출 할 수 있습니다 (인수로 지정). ** ** 왜이 일을하고 싶습니까? – Darthfett

답변

1

당신은

mro = my_super.__self_class__.mro() 
wrapped_class = mro[mro.index(my_super.__thisclass__) + 1] 

이 복잡한 보이는 사용하여 포장 클래스를 추출 할 수 있습니다, 그러나 나는 또한이 작업을 수행하는 것이 오히려 무의미하다고 생각합니다.

: selfsuper()으로 전달하지 못한 것으로 나타났습니다. 이 경우 사용할 수 있습니다

wrapped_class = my_super.__thisclass__.mro()[1] 

남은 질문은 다음과 같습니다. 왜이 작업을 수행 하시겠습니까?

+0

이유는 - 다중 상속 클래스 체인이 있습니다. 생성자는 모두 kwargs를 지원합니다. 문제는 내가 어떤 클래스에서 "객체"인 슈퍼를 가지고 있고 다른 mro의 클래스에서 다른 클래스가 슈퍼 클래스라는 것입니다. 난 그냥 항상하는 데 사용하십시오 슈퍼 (MyClass에, 자기) .__ 초기화 __ (** kwargs로)를 를 ...하지만 지금 BTW ... 을 인수/kwargs로를하지 않는 개체를 더 이상 사용되지 경고를 발생시킵니다. .. 에티켓이 "오래된"질문에 무엇인지 모르겠다 - 나는 많은 포럼에서 오래된 스레드를 되살리는 것이 바람직하지 않다는 것을 알고있다. 이전 질문에 대한 대답을 표시하는 것은 어떻습니까? –

+0

@PaulMolodowitch : 이것을 처리하는 올바른 방법은 각 생성자가 자체적으로 사용하는 인수를 튀어 나오게하기 위해'__init __ (self, x, y, ** kwargs)'와 같은 서명을 사용하고'** kwargs 'super' 생성자에 대해서 말입니다. 이렇게하면'object'에 도달하면 ** kwargs가 비게되고 오류 메시지는 나타나지 않습니다. 자세한 내용은 Raymond Hettinger의 "Python의'super()'super"또는 비슷한 것을 참조하십시오. - 나는 Google이 링크를 찾을 것이라고 확신합니다. –

+0

사실, 그게 일반적으로 내가 처리하는 방식입니다 ... 그 특별한 경우에는, 나는 커스텀'__init__'과 커스텀'__new__' 클래스를 가진 기존 코드베이스를 다루고 있다고 생각합니다. args/kwargs를 "적절히"팝핑하지는 않았습니다. '__new__' 만 사용하도록 전체 클래스 계층 구조를 다시 작성하고 kwargs (그리고 테스트/디버그가 올바르게!)를 터뜨린 것을 확인하는 것이 내가 지금까지했던 것보다 많은 일이었습니다 ... –

관련 문제