문제

클래스 계층 구조 및 생성자는 관련이 있습니다. 아동 수업의 매개 변수는 부모에게 전달되어야합니다.

따라서 파이썬에서는 다음과 같은 것으로 끝납니다.

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

12 개의 아동 수업과 많은 매개 변수로 이것을 상상해보십시오. 새로운 매개 변수를 추가하는 것은 매우 지루해집니다.

물론 하나는 이름이 지정된 매개 변수를 완전히 분배하고 *args 및 ** kwargs를 사용할 수 있지만 방법 선언을 모호하게 만듭니다.

파이썬 (2.6)에서 우아하게 다루기위한 패턴이 있습니까?

"우아하게"라면 매개 변수가 나타나는 횟수를 줄이고 싶다는 것을 의미합니다. a, b, c, ka, kb, kc는 모두 3 번 나타납니다. 아동 생성자, 슈퍼 () 상위 호출 및 상위 생성자에 나타납니다.

이상적으로는 부모의 매개 변수를 지정하고 싶습니다. 이니 한 번, 그리고 아이에서 이니 추가 매개 변수 만 지정하십시오.

나는 다음과 같은 일을하고 싶다 :

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에 할당 된 이후로 작동하지 않습니다.

위를 달성하기위한 우아한 파이썬 패턴이 있습니까?

도움이 되었습니까?

해결책

"12 개의 자식 수업과 많은 매개 변수"는 매개 변수 이름 지정에 관계없이 문제처럼 들립니다.

나는 약간의 리팩토링이 일부를 벗길 수 있다고 생각합니다. 전략 이 계층 구조를 단순화하고 슈퍼 복합 생성자를 사라지게하는 객체.

다른 팁

글쎄, 내가 볼 수있는 유일한 해결책은 *args 및 ** 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

이렇게하면 각 클래스에 필요한 매개 변수를 볼 수 있지만 다시 유형이 필요하지 않습니다.

주목해야 할 것은 원하는 주문 (a, b, c, d, e, f)가 (d, e, f, a, b, c)를 잃는다는 것입니다. 다른 이름이 아닌 매개 변수 앞에 *args를 가질 수있는 방법이 있는지 확실하지 않습니다.

매개 변수를 자체 객체로 그룹화하려고합니다. 예를 들어, 소스 정류장, TargetDirectory, TermaryDirectory, ServerName, ServerPort를 전달하는 대신 DirectoryContext 및 ServerContext 객체가 있습니다.

컨텍스트 개체가 더 많은 동작이나 논리를 갖기 시작하면 언급 된 전략 객체로 이어질 수 있습니다. 여기.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top