2016-10-03 2 views
0

필자는 연장하고자하는 "블랙 박스"파이썬 모듈을 가지고 있습니다. 이 모듈은 함수가없는 클래스 class Foo을 제공하고 Foo 유형의 객체를 반환하는 도우미 함수 FooMaker을 제공합니다. 확장 모듈의 일반적인 전략 :블랙 박스 파이썬 모듈 확장하기

class ExtendedFoo(blackbox.Foo): 
    def __init__(self, x): 
     super(ExtendedFoo, self).__init__(x) 

내가 blackbox.FooMaker 대신 Foo__init__ 기능에 의존 할 필요가 위에서 언급 한 바와 같이, 이후 여기에 작동하지 않을 것입니다.

모듈을 확장하는 방법에 대한 아이디어 blackbox?

+1

귀하의 init 내에서 FooMaker를 호출합니까? – idjaw

+3

전문화보다는 컴포지션 사용 –

+0

FooMaker가 수행하는 init'ish 작업 전후에'__init__'을 실행 하시겠습니까? – MisterMiyagi

답변

0

IT는 Foo 클래스는 세터 기능, 그래서 뭐 결국 나를 위해 일한 것은

class ExtendedFoo(blackbox.Foo): 
    pass 

def ExtendedFooMaker(*args): 
    _efoo = ExtendedFoo() 
    _efoo.set(FooMaker(*args).get()) 
    return _efoo 
-1

모듈이 심각한 해킹을하는 경우가 아니면 모듈을 교체 할 수 있습니다. 모든 참조 및 할당은 로컬 이름이 아닌 blackbox. 이름에서 작동합니다.

새 클래스 '__init__FooMaker 내에서 실행하려면 Foo을 상속하고 바꿉니다.

import blackbox 
class ExtendedFoo(blackbox.Foo): 
    def __init__(self, x): 
     super(ExtendedFoo, self).__init__(x) 

blackbox.Foo = ExtendedFoo 

이 방법

, FooMakerExtendedFoo의 클래스를 인스턴스화합니다.

또는 FooMaker을 자신의 버전으로 바꿀 수 있습니다.

import blackbox 
_bbfoomaker = blackbox.FooMaker # keep reference so we can use it later 
def SuperFooMaker(*fooargs, **fookwargs): 
    new_instance = _bbfoomaker(*fooargs, **fookwargs) 
    new_instance.whitebox = True # or whatever 

blackbox.FooMaker = SuperFooMaker 

두 번째에 제한은 다른 모듈이 from blackbox import FooMaker 같은 것을 않는 경우, 모듈 전에 수입/실행해야한다는 것입니다. 그렇지 않은 경우 나머지 모듈은 원래 공장을 계속 볼 수 있으며 여전히 _bbfoomaker과 유사합니다.

+0

첫 번째 옵션은 작동하지 않았습니다. 아마도 블랙 박스 모듈이 자체 네임 스페이스로 이상한 일을했을 수도 있기 때문입니다. 두번째 옵션은 단지'blackbox.Foo'의 인스턴스를 생성하는 반면, 나는 정말로 새로운 이름을 가진 새로운 클래스를 원합니다. –

+0

이'blackbox'가 어떻게 든 볼 수 있습니까? – MisterMiyagi

+0

네, 클래스'Foo'는'lxml.etree._ElementTree'이고'FooMaker'는'lxml.etree.parse'입니다. –

1

이것은 당신의 솔루션으로 동일한 작업을 수행해야했다을 한 것으로 밝혀졌다하지만 조금 짧은 :

from blackbox import Foo, FooMaker 

class ExtendedFoo(Foo): 

    def __init__(self, *args, **kwargs): 
     self.set(FooMaker(*args, **kwargs).get()) 
관련 문제