2017-10-02 1 views
-1

간단한 전략 디자인 패턴에 관해 더 많은 디자인 성격의 질문이 있습니다.파이썬 인터페이스와 자기 instanciation

내가 인터페이스를 가지고 있다고하자 :

class RenewInterface: 
    def __init__(*args, **kwargs): 
     self.var1 = {} 
     self.var2 = [] 
     if args: 
      for i in args: 
       inst = i() 
       self.var1[inst.__class__.__name__] = inst 

    @abstractmethod 
    def renew(*args, **kwargs) 
     Do some stuff and call renew in self.var1[inst__class__.__name__] 

class ChildClass(RenewInterface): 
    def __init__(*args, **kwargs): 
     super(ChildClass, self).__init__(*args, **kwargs) 

    def renew(self, *args, **kwargs) 
     Do more stuff 

내가 그 클래스에서 상속 내가 선택하는 경우 슈퍼 __init__ (위의 코드)를 호출 할 수 있습니다. args가 없다면 var1var2을 자식 클래스에만 노출 시키지만 어떤 이유로 args가 있고 부모 (RenewInterface)를 super(ChildClass, self).__init__(*args, **kwargs)이라고하고 어떤 이유로 arg가 ChildClass의 클래스이면 ChildClass 자체를 인스턴스화하는 것 같아요?

  1. 건너가 슈퍼 클래스
  2. 가 ChildClass에 모두 함께 __init__ 건너 뛰기 호출?하지만 그것은 인스턴스화
  3. 을 위해 다시 RenewInterface __init__를 사용 : 나는 슈퍼 클래스의 변수에 대한 상관 없어 이후에 OK입니다

나는 모든 것을 시험해 보았지만 모두 작동하지만, 가장 "불쾌한"방법은 무엇인지 모르겠습니다. 더 중요한 것은 2.6, 2.7 및 3.3 이상으로 다양합니까?

나는

감사

+0

나는 당신이 무엇을하려고하는지 전혀 모른다. 그래서 나는 당신의 질문에있는 작은 질문들에 대답 할 것이다 : 1) _ "arg가 스스로의 문자열 클래스라면, 나는 그 자체로부터 ChildClass를 instanciate하겠습니까?" _ "자기 자신의 현악기"란 무엇을 의미합니까? 그리고, 그건 아무것도 인스턴스화하지 않습니다. 클래스가 _ 문자열로 끝나면 오류가 발생합니다. 2) _ "수퍼 클래스의 변수는 신경 쓰지 않기 때문에 OK입니다."_ 아니요, 좋지 않습니다. 부모 클래스의 변수에 신경 쓰지 않는다면 부모 클래스에서 상속해서는 안됩니다. –

+0

arg가 클래스 ChildClass 인 경우 거기에 오타가 있었으며, 문자열이 너무 적었습니다. 위의 코드는 더 많은 sudo 코드이며 작업 코드를 최소한으로 표현한 것입니다. 비록 변수에 대해 신경 쓰지 않는다고해도 확실히 이것들이 전략 패턴의 기본을 구성하는 방법에 신경 써야합니다 (내가 보았 듯이) – JoYiDer

답변

0

만약 내가 잘못 정정 해줘.

당신이 원하는 것을 보인다 문서를 읽고 구글려고했는데, 나는 어떤 결정적인 정보를 :(못 찾았습니다 메소드 오버로딩을 처리 할 수있는 가장 파이썬 방법을 알고, 구체적으로는 초기화 방법은 문제를 해결하기 위해

를 옵션은 다음과 같습니다. 1. 과부하 방법,하지만 D 슈퍼 클래스의 메소드 호출을하지 말아라 2. 메소드에 과부하를주지 마라. 수퍼 클래스의 메소드는 그대로 둡니다.

이것은 '파이썬적인'문제가 아니며, OO와 관련이 있습니다. 기본 클래스 메서드는 기본 구현을 제공합니다. 기본 구현을 원하지 않으면 메서드를 재정의하십시오. 내가 들었을 때, 당신은 당신의 하위 클래스에 대한 기본 구현에 만족하지 않습니다. 그것을 무시하십시오.