2012-02-07 12 views
6

概要:今ネストされたオブジェクトと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に設定されたすべての属性がo.innerに設定する必要があり、ために同じ読み取り:o.somethingは、実際にはo.inner.sommethingの値を返します。プロキシやリレーのようなもの。 Outerため

__getattr__は、単純な&作品を思わ:

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

にはどうすれば__setattr__を扱うでしょうか?私は、再帰エラーを引き起こさず、自分自身を憎んでしまうものを思い付くことができませんでした。

概念自体に欠陥がありますか?

(私が試した別のアプローチは、InnerOuterサブクラスを作っていた - これは本当に審美的存在@classmethodsを果たしていませんでした、ではないに言及IDEは、それらの内部で迷子になり - 。いくつかの属性を解決することができないのは、それを残してみよう今のところおそらく?)

+0

あなたは 'self.inner = Inner(z)'を意味しましたか?また、getattrメソッドはInner()からデータを返しますか?それが書かれている方法では、それはちょうど外部を参照するように見えます。 – gfortune

+0

はい - 返されます。両方とも修正しました。ありがとう! – ntl0ve

答えて

7

innerの属性を正しく設定しているのは、Outerクラスの属性です。何ができることはobject__setattribute__方法(Outerの基底クラス)を呼び出すです:今

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から継承されていると、より自然でpythonのようです。

+0

そして、print(o.inner)が動作する理由は、o.innerがすでに存在しているため、 '__getattr__'を呼び出さずにo.inner.innerを返そうとしているからです。要求されたアイテムが問題のオブジェクトの一部として既に存在する場合、 '__getattr__'が呼び出されないことは明らかではありません。 – gfortune

+0

@gfortune、yes;詳細については[この質問](http://stackoverflow.com/questions/3278077/difference-between-getattr-vs-getattribute-in-python)を参照してください。 – senderle

+0

はい、[\ _ \ _ getattr \ _ \ _](http://docs.python.org/reference/datamodel.html#object.__getattr__)docs – jterrace

関連する問題