2012-02-07 1 views
6

개요 : - o에 설정된 속성에 대한 동일 o.inner에 설정해야 이제중첩 된 개체와 않은 setattr 및 getattr (예, 그건 시간)

class Inner(object): 
    def __init__(self, x): 
     self.x = x 

class Outer(object): 
    def __init__(self, z): 
     self.inner = Inner(z) 

o = Outer(10) 

, 나는 외부 물체가 투명하게 행동 할 읽기 : o.something은 사실 o.inner.sommething의 값을 반환해야합니다. 프록시 나 릴레이 같은 것.

def __getattr__(self, item): 
    return getattr(self, item) 

가 어떻게 __setattr__을 처리 할 것입니다 : Outer에 대한

__getattr__ 은 간단 & 작품을 보인다? 나는 재귀 오류를 일으키지 않고 스스로 나를 싫어하게 만드는 것을 만들 수 없었다.

개념 자체에 결함이 있습니까? 이 정말 IDE가 그 내부에서 길을 잃을 것이라고 말할 것도없고, 미학적 본 @classmethods 재생되지 않았다 - -

(나는 시도 또 다른 방법은 Outer Inner의 서브 클래스 만들고 있었다. 몇 가지 특성을 해결할 수없는을의가 있음을 떠나 보자 지금은 아마도?)

+0

'self.inner = Inner (z)'를 의미 했습니까? 또한 getattr 메서드가 Inner()에서 데이터를 반환합니까? 그것이 쓰여지는 방식으로, 그것은 단지 Outer를 참조하는 것처럼 보입니다. – gfortune

+0

예 - 반환합니다. 둘 다 고쳤어, 고마워! – ntl0ve

답변

7

까다로운 부분은 Outer 클래스의 inner 속성을 올바르게 설정하는 것입니다. 당신이 할 수있는 것은 (Outer의 기본 클래스) object__setattribute__ 메서드를 호출 할 수 있습니다 : 지금

class Inner(object): 
    def __init__(self, x): 
     self.x = x 

class Outer(object):  
    def __init__(self, z): 
     object.__setattr__(self, 'inner', Inner(z)) 

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

    def __setattr__(self, name, value): 
     return setattr(self.inner, name, value) 

, 제대로 작동 그러나

o = Outer(10) 
print o.x  # 10 
print o.inner.x # 10 
o.g = 3 
print o.g  # 3 
print o.inner.g # 3 

, 그것으로 명확하지 내 당신이하지 않는 이유 이 경우에는 상속을 사용하고 싶습니다. OuterInner에서 상속받은 것이 더 자연스럽고 파이썬 스럽습니다.

+0

그리고 print (o.inner)가 작동하는 이유는 o.inner가 이미 존재하여'__getattr__'을 호출하지 않고 o.inner.inner를 반환하려고했기 때문입니다. 요청한 항목이 이미 해당 객체의 일부로 존재하는 경우'__getattr__'가 호출되지 않는다는 것이 명확하지 않습니다. – gfortune

+0

@gfortune, 예; 자세한 내용은 [이 질문] (http://stackoverflow.com/questions/3278077/difference-between-getattr-vs-getattribute-in-python)을 참조하십시오. – senderle

+0

예, [\ _ \ _ getattr \ _ \ _] (http://docs.python.org/reference/datamodel.html#object.__getattr__) 문서를 참조하십시오. – jterrace

관련 문제