2016-08-05 3 views
0

나는 개체처럼 가지고, 내가동적으로 프록시 클래스 용 메소드를 생성하는 방법은 무엇입니까?

>>> f.some_method() 

을하고 다음 호출을 할 수 있도록하려는

class Foo(object): 
    def __init__(self,instance): 
     self.instance = instance 

>>> instance = SomeOtherObject() 
>>> f = Foo(instance) 

>>> f.instance.some_method() 

컴 plicated 이유, 단순히 위의 특성을 체인 수 없습니다. 동적으로 f에 임베디드와 동일한 함수 시그니처가있는 인스턴스 함수를 생성해야합니다. instance. 즉 f.some_method()을 수행하고 some_method을 포함 된 개체 instance으로 푸시하는 호출시 f 인스턴스에 대해 some_method 인스턴스 메서드를 동적으로 만들어야합니다.

나는 의미가 있기를 바랍니다. 이것은 Python 2.7 용입니다. 어떤 도움을 주셔서 감사합니다.

+0

코드에서'Foo'를 생성하려면, 다른 것으로의 인스턴스를 인수로 넘겨야하므로'f = Foo()'가 에러를 일으킬 것입니다. – martineau

답변

3

프록시 클래스에 대해 __getattr__() 메서드를 작성하십시오. 이는 인스턴스에없는 속성에 액세스 할 때 호출됩니다. 같은 이름의 포함 된 객체의 속성 (또는 주장하는 경우에는 래퍼를 반환하지만 포함 된 객체의 메서드를 호출하고 다른 작업을 수행 할 필요가없는 경우에는 필요하지 않습니다.) 보너스 : 데이터뿐만 아니라 호출 가능 항목에서도 작동합니다.

def __getattr__(self, name): 
    return getattr(self.instance, name) 

그러나 __ 방법으로는 작동하지 않습니다.

1

wrapt 모듈을 확인해야합니다. 랩핑 된 오브젝트의 특정 측면을 선택적으로 대체 할 수있는 투명한 오브젝트 프록시를 작성하기 위해 빌드 된 것입니다.

class Test(object): 
    def some_method(self): 
     print 'original' 

import wrapt 

proxy = wrapt.ObjectProxy(Test()) 
proxy.some_method() 

print 

class TestWrapper(wrapt.ObjectProxy): 
    def some_method(self): 
     self.__wrapped__.some_method() 
     print 'override' 

wrapper = TestWrapper(Test()) 
wrapper.some_method() 

이 수율 : 예를 들어

original 

original 
override 

ObjectProxy 클래스의 기본 동작은 모든 방법은 프록시 호출 또는 액세스를 속성입니다. 프록시를 통해 속성을 업데이트하면 래핑 된 객체도 업데이트됩니다. 특별한 __ 방법 및 다른 많은 것들에 대한 작품뿐만 아니라. wrapt에 대한 자세한 내용은

은 다음을 참조하십시오

대상 프록시에

구체적인 세부 사항은에서 찾을 수 있습니다 :

이것을 제대로 수행하는 데 많은 함정과 함정이 있으므로 가능한 경우 wrapt을 사용하는 것이 좋습니다.

관련 문제