2012-01-16 2 views
3

를 호출 나는 C 클래스 정의와 그 클래스에 대한 몇 가지 내부 클래스 정의가 있습니다다른 클래스 내에서 클래스를 정의하고 부모 방법

class DoXJob(): 
    def __init__(self, param1, param2): 
     <choose an inner class to use> 

    def DoIt(self): 
     pass 

    def Finalize(self): 
     <do finalization> 

    class DoXInSomeWay(): 
     def __init__(self): 
      .... 
      .... 
     def DoIt(self): 
      ... 

    class DoXInSomeOtherWay(): 
     def __init__(self): 
      .... 
      .... 
     def DoIt(self): 
      ... 

논리는 내가 일을 처리하기 위해 일부 내부 클래스 정의가, 간단을, 난

obj = DoXJob(param1, param2) 
obj.DoIt() 

모두 승 미세 일부 매개 변수 DoXJob, 그것은 다음 내부 클래스가 사용될 결정 호출 선택된 내부 클래스 법 (DoXInSomeOtherWay.DoIt 또는 DoXInWay.DoIt)의 방법 DoXJob.DoIt 메소드를 재정의 내가 원한 모자는 을 DoXInSomeOtherWay.DoIt 또는 DoXInWay.DoIt에서 호출하는 것과 같이 ineer 클래스에서 트리거하는 것입니다. 그러나 나는 이것을 어떻게 처리 할 것인지, 그것이 올바른지 여부를 모른다.

obj = DoXJob(param1, param2) 
obj.DoIt() 
obj.Finalize() 
+3

내부 정보를 제거하고 하위 클래스를 만들고 다른 정보를 덮어 쓰지 않는 이유는 무엇입니까? – DonCallisto

+0

또는 전략 패턴과 같은 기존의 방식을 시도 할 수 있습니다. –

+0

@DonCallisto 하위 클래스 및 상속을 사용해야하는 것은별로 없습니다. 게다가 내부 클래스는 기본 클래스 내에서만 사용되므로 하위 클래 싱 대신이 패턴을 따르는 것이 나에게 더 논리적으로 보였다. – FallenAngel

답변

2

불행하게도, 파이썬이 둘러싸는 인스턴스를 참조 할 수있는 방법이하지 않는 것 : 아니면 더 나은 같은 DoXJob 메소드 호출로 만드는 것입니다.

대신 어떤 내부 클래스를 사용할지 선택하고 아마도 그것을 인스턴스화하는 외부 __init__에서 외부 객체의 self을 내부 클래스 인스턴스의 매개 변수로 전달해야합니다.

수정 : 테마를 다시 디자인하는 경우 - 간단히 DoIt 메서드를 호출 한 다음 반환을 기다리는 경우 Finalize을 호출자와 동일한 위치에서 호출하여 필요성을 피할 수 있습니다. 내면이 바깥 쪽을 부르기 위해.

+0

상위 레벨 인스턴스를 호출 할 수 없습니다. 유용한 언어를위한 handycap입니다. 내 접근 방식은 당신이 편집에서 제공하는 것과 비슷할 것입니다. 나는 메소드 오버라이드를 버리고 상위 클래스 변수를 내부 클래스 인스턴스로 설정하고 상위 레벨 DoIt 메소드에서 DoIt 호출을합니다. 그게 더 깨끗한 해결책이 될거야. – FallenAngel

+0

@FallenAngel : 나는 그것이 실제로 어떤면에서는 좋은 것이라고 생각한다. 좀 더 짜증나는 것은 둘러싸는 클래스의 범위에 정의 된 이름이 내부 클래스의 범위에 있지 않다는 것입니다 (그리고 어떤 인스턴스도 아닌 외부 클래스 객체의 이름을 참조하십시오). – Marcin

+0

그게 무슨 뜻인지 ... 나는 단지 몇 가지 클래스 변수에 접근하고 싶다 ...하지만 그럴 수 없기 때문에 변수를 내부 클래스 인 "nit'as 매개 변수에 전달하거나 내부 클래스 인스턴스를 일부 encolsing 클래스 변수로 설정 한 다음 내부 클래스 함수를 호출하기 전에 내부 클래스 변수를 정의해야합니다. – FallenAngel

관련 문제