2013-03-02 2 views
0

제목이 너무 잘못되었거나 오해하지는 않았 으면합니다. 나는이 이름의 것이 무엇인지에 대해 확신 할 수 없다.반환하기 전에 서브 클래스의 생성자에 인스턴스 래핑

기본적으로 사전 (예 : defaultdictOrderedDict)을 사용하여 많은 작업을 해오 고 있으며이 기능 중 일부를 수행하는 몇 가지 도우미 기능을 수행하려고합니다. 여전히 여러 가지 유형의 사전에 걸쳐 작동합니다. 이상적으로, 나는 이것을 (즉, 어느 정도의 최적화로) 신속하게 그리고 물론 우아하게하고 싶습니다. 이 잘 작동

def filter_dict(old_dict, keep_keys): 
    return {k:v for k,v in old_dict.items() if k in keep_keys} 

하지만 old_dict은 기본 사전 이외의 경우, 그 잃을 : 여기에 내가 지금 무엇을의 예입니다. 좋아

는, 그래서 old_dict의 클래스의 생성자에서 새로 만든 사전을 래핑하는 type(old_dict)({.....}) 뭔가를 할 수 있지만 여전히 첫 번째 인수 기본 값을 반환하는 함수로 을 defaultdicts, 작동하지 않습니다. 두 번째 인수 인 경우 *args 또는 무언가를 생성자에 전달할 수 있지만 상황이 복잡합니다.

제 질문은 짐작합니다. 생성자에 부분적으로 응용 프로그램을 가져올 수 있습니까? 나는 그 인스턴스의 용기를 얻고 items을 제외한 모든 것을 그대로 가지고 클래스 생성자를 호출 할 수 있습니까? 하스켈에서 나는 reverse = lambda f, x, *args: f(*args, x)과 같은 것을 할 것입니다. 그러나 그것은 파이썬에서도 허용되지 않습니다.

무엇이 누락 되었습니까? 수업에 대한 내성? __new__로 팅겨 보고요? 공장 ... 무언가? 나는 꽤 무언가를 얻으려고 여기에서 벙어리 감각이 있지만 기능적이다.

사전 통찰력에 감사드립니다.

답변

0

원래 개체를 복사 한 다음 복사본을 변경합니다. 당신의 예에서 : 도우미 기능은 그들이 old_dict 그들이 동일하게 유지하고 싶지 일을 변경하고자하는 일에 대해 알고처럼

def filter_dict(old_dict, keep_keys): 
    res = old_dict.copy() 
    for k in res.keys(): 
     if k not in keep_keys: 
      res.pop(k) 
    return res 

는 소리가 난다. 따라서 가장 안전한 방법은 copy 메서드 (또는 copy 모듈)를 사용하고 싶지 않은 것을 제거하거나 변경하는 것입니다. 그렇지 않으면 개체를 만드는 데 사용 된 인수를 정확히 호출 할 수있는 방법이 필요하며이를 수행하는 일반적인 방법이 있는지 여부를 알 수 없습니다.

+0

그래, 나는 이것을 확실히 고려했다. 그러나 그것은 정말로 ... brutish로 보인다? 그리고 반성, 클래스 레이아웃 등으로 들어가기 위해 노력한 이래로 좋은 학습 기회라고 생각합니다. 다른 모든 것이 실패하면 keep_keys 또는 k가 아닌 경우 delc와 함께 deepcopy를 반환 할 수 있습니다. 일부. 응답 해 주셔서 감사합니다. –

+0

나는 우아함에 대한 당신의 욕구를 이해하지만 명확성 및/또는 기능 대신에 객체 지향 디자인을 자신의 목적으로하지 말라고주의하겠습니다. 복사 생성자는 원하는 것과 거의 동일하게 수행합니다. 이전 객체와 동일한 데이터로 새 객체를 초기화합니다. 개인적으로는 __new__ 등의 미묘한 트릭을 사용하여 코드를 읽는 것이 어렵지 만 때로는 필요한 경우도 있습니다. – cxrodgers

관련 문제