2009-07-29 6 views
4

클래스 계층 구조 및 생성자가 관련되어 있습니다. 하위 클래스의 매개 변수는 부모에게 전달되어야합니다.파이썬의 생성자 전문

그래서, 파이썬에서, 우리는이 같은 끝낼 :

class Parent(object): 
    def __init__(self, a, b, c, ka=None, kb=None, kc=None): 
     # do something with a, b, c, ka, kb, kc 

class Child(Parent): 
    def __init__(self, a, b, c, d, e, f, ka=None, kb=None, kc=None, kd=None, ke=None, kf=None): 
     super(Child, self).__init__(a, b, c, ka=ka, kb=kb, kc=kc) 
     # do something with d, e, f, kd, ke, kf 

가 다스 자식 클래스 및 매개 변수의 많은이를 상상해보십시오. 새로운 매개 변수를 추가하는 것은 매우 지루합니다.

물론 명명 된 매개 변수를 사용하지 않고 * args 및 ** kwargs를 사용할 수는 있지만 메서드 선언이 모호합니다.

Python (2.6)에서이 문제를 우아하게 처리 할 패턴이 있습니까?

"우아하게"나는 매개 변수가 나타나는 횟수를 줄이려고합니다. a, b, c, ka, kb, kc는 모두 Child 생성자에서 Parent에 대한 super() 호출과 Parent 생성자에서 세 번 나타납니다.

적으로는, 내가 한 번 부모의 초기화에 대한 매개 변수를 지정하고 싶습니다, 그리고 자녀의 초기화에 만 추가 매개 변수를 지정합니다.

나는 같은 것을 할 싶습니다

class Parent(object): 
    def __init__(self, a, b, c, ka=None, kb=None, kc=None): 
     print 'Parent: ', a, b, c, ka, kb, kc 

class Child(Parent): 
    def __init__(self, d, e, f, kd='d', ke='e', kf='f', *args, **kwargs): 
     super(Child, self).__init__(*args, **kwargs) 
     print 'Child: ', d, e, f, kd, ke, kf 

x = Child(1, 2, 3, 4, 5, 6, ka='a', kb='b', kc='c', kd='d', ke='e', kf='f') 

이 불행하게도 작동하지 않습니다, 4 년 이후, 5, 6 최종 최대 KD, KE, KF에 할당.

위의 작업을 수행 할 수있는 우아한 파이썬 패턴이 있습니까?

+0

어떻게 작동하길 원하십니까? 여하튼 나는 더 우아함에 대한 가능성이 어디서 나오는 지 보지 못한다. –

답변

6

매개 변수 명명과 관계없이 "12 개의 하위 클래스와 많은 매개 변수"가 문제가됩니다.

나는 약간의 리팩토링이 계층 구조를 단순화하고 슈퍼 복잡한 생성자 멀리 갈 수 있도록 할 몇 가지 전략 객체를 벗겨 수 있다는 것을 생각한다.

+0

나는 이미 몇 가지 전략 객체를 고려해 봤지만, 당신의 의견은 내가 이미 봤던 것을 끝난. 감사! –

2

글쎄, 난 나와 변수뿐만 아니라 * 인수와 ** kwargs로의 혼합물을 사용하고 볼 수있는 유일한 솔루션과 같은 :

class Parent(object): 
    def __init__(self, a, b, c, ka=None, kb=None, kc=None): 
     pass 

class Child(Parent): 
    def __init__(self, d, e, f, *args, kd=None, ke=None, kf=None, **kwargs): 
     Parent.__init__(self, *args, **kwargs) 
     pass 

이 방법, 당신은에 의해 요구되는 매개 변수를 볼 수 있습니다 각 클래스는 다시 입력 할 필요가 없습니다.

주목할 점은 (d, e, f, a, b, c)가되면 원하는 순서 (a, b, c, d, e, f)를 잃게된다는 것입니다. 이름이없는 다른 매개 변수 앞에 * 인수가있는 방법이 있는지 확실하지 않습니다.

+0

그건 내 첫 번째 생각 뿐이었지만 파이썬은 * args와 ** kwargs가 적어도 2.6에서 마지막으로 필요하다고 생각합니다. –

+0

음, 네. 나는 당신이 파이썬 3으로 옮길 때 그 가능성들 중 하나로 그것을 잠그고 있다고 생각한다. – Adam

1

예를 들어, sourceDirectory, targetDirectory, temporaryDirectory, serverName, serverPort를 전달하는 대신 매개 변수를 해당 객체로 그룹화하려고 시도합니다. DirectoryContext 및 ServerContext 객체가 있습니다.

동작 또는 논리가 더 많이 시작되면 here에 언급 된 전략 개체로 이어질 수 있습니다.