2009-09-24 6 views
1

다른 파이썬 클래스의 래퍼 역할을하는 파이썬 클래스를 갖고 싶습니다. 이파이썬 2.5에서 외관 만들기

class xxx: 
    name = property(fset=lambda self, v: setattr(self.inner, 'name', v), fget=lambda self: getattr(self.inner, 'name')) 

    def setWrapper(self, obj) 
     self.inner = obj 

같은

뭔가 그래서 누군가가 말할 때 XXX(). X = '안녕하세요'내가이 XXX에 값을 설정하려면(). inner.whatever와(). X를 xxx는 없습니다.

이것이 가능합니까? 나는 람다를 시험해 왔지만 아무 소용이 없다. 파이썬 2.5를 사용 중입니다.

편집 : 이제 내 아내가 침대에 서둘러 서지 않으므로 코드를 조금 더 플러시 할 수 있습니다. 나는 너희들이 아래에 있었는지에 대한 아이디어를 가지고 있었지만, docs에서 __setattr__/__getattr__을 무시하고 대신 속성을 사용해야한다고 생각했다. 속성 함수를 통해이 작업을 수행 할 수없는 경우 __setattr__/__getattr__을 사용하겠습니까? 감사합니다.

답변

6

여기서는 here과 같이 __setattr____getattr__ 방법을 사용합니다. 한마디로

,이 작업을 수행 할 경우 :

class Wrapper(object): 
    def __init__(self, wrapped): 
     object.__setattr__(self, 'inner', wrapped) 

    def __getattr__(self, attr): 
     return getattr(self.inner, attr) 

    def __setattr__(self, attr, value): 
     setattr(self.inner, attr, value) 

그것은 당신이 계신해야한다. 위에 링크 된 문서를 읽는 것이 좋습니다.

편집 : 지적한대로 원래 버전은 __setattr__이 무조건 호출되어 실패합니다. 이 예제를 업데이트했습니다. 이 버전은 새로운 스타일의 클래스 비헤이비어 (객체의 하위 클래스로 표시됨)에 의존합니다. 이전 스타일을 위해 나는 다음과 같이 __dict__ 엉망 필요 거라고 생각 : 후자를 사용하는 경우

는하지만 당신이 치료를 키를 필요로 다른 답변 말했듯이
class OldStyleWrapper: 
    def __init__(self, wrapped): 
     self.__dict__['inner'] = wrapped 

    def __getattr__(self, attr): 
     return getattr(self.inner, attr) 

    def __setattr__(self, attr, value): 
     setattr(self.inner, attr, value) 
5

, __getattr____setattr__이 있습니다 ... : __getattr__ 만, 그렇지 않으면 존재하지 않는 속성에 대해 호출되는 때문에

class Wrapper(object): 
    def __init__(self, wrapped): 
     object.__setattr__(self, 'inner', wrapped) 

    def __getattr__(self, n): 
     return getattr(self.inner, n) 

    def __setattr__(self, n, value): 
     setattr(self.inner, n, value) 

당신은 self.inner액세스에 대한 예방 조치가 필요하지 않습니다; 하지만 object에서 상속__setattr__, 당신은 내가 목적으로 object를 사용하고 여기에 __setattr__ (명시 적으로 우회 할 필요가 실제로 을 필요로 할 때 너무self.inner (또는 다른 속성)을 설정, 각 속성이라고, 그래서 또한 내가 됩니다 - 어쨌든, 파이썬 2. *에서는을 사용하는 것이 좋습니다. 그렇지 않으면 정말로 원하지 않는 "구식 클래스"[[마지막으로 파이썬 3에서 사라진 종류]]를 만들 수 있습니다. .. ;-).

+0

좋은 점은, 나는 당신에 맞게 내 예제를 수정했습니다. =) – Benno

0

나는 다음과 같이 알렉스와 벤의 답변 모두가 않은 setattr 전화를 편집한다고 생각 :

setattr(self.inner, n, value) 
관련 문제