2012-03-17 6 views
1

私はPython 2.6で "new style"クラスを使用していますが、サブクラスで__getattr__に問題があります。python __getattr__と__name__

サブクラスは、このような...

def __getattr__(self, name): 
    if self.__folderDict.has_key(name): 
     if name == 'created': 
      return doSomethingSpecial(self.__folderDict[name]) 
     return self.__folderDict[name] 
    else: 
     raise AttributeError() 

のように実装している場合、私の属性例外が__NAME__する参考のためにスローされます、なぜそれは私にははっきりしていませんか?

私は、__getattr__が呼び出されるべきではないということを理解しています。私は新しいスタイルを使用しているので、__name__を__getattribute__で完全にする必要がありますか?ああ、大丈夫:

は、ここでより完全な例です...

class Base(object): 
    @staticmethod 
    def printMsg(msg, var): 
     print msg + str(var) 
     return 

    def printName(self): 
     Base.printMsg('#', self.__name__) 
     return 

class Derived(Base): 
    def __getattr__(self, name): 
     if self.__testDict.has_key(name): 
      return self.__testDict[name] 
     else: 
      raise AttributeError() 

    __testDict = {'userid': 4098} 


d = Derived() 
print d.userid 
d.printName() 

結果は...

4098 
Traceback (most recent call last): 
File "D:/.../Scratch/scratch01.py", line 24, in <module> 
d.printName() 
File "D:/.../Scratch/scratch01.py", line 17, in __getattr__ 
raise AttributeError() 
AttributeError 
+2

実際の呼び出しコードとトレースバックを表示できますか? – bgporter

+0

前のコメントに同意すると、あなたの情報はあまり詳しくはっきりしていないので、回答を書くときに混乱するかもしれません。しかし、あなたの__getattr__と__getattribute__の理解によれば、[this post](http://stackoverflow.com/questions/3278077/difference-between-getattr-vs-getattribute-in-python)はあなたにとって役に立つようです。 – Reorx

+0

は別の簡単な例を追加しました –

答えて

1

__name__は、インスタンスではなくクラスオブジェクト用に事前定義されており、読み取る前にどこでも__name__を定義していません。したがって_getattr__が呼び出され(通常のルックアップでは__name__が見つかりません)、例外が発生します。私はあなたが実際に望んでいると思う:

... 
def printName(self): 
    Base.printMsg('#', self.__class__.__name__) 
    return 
... 
+0

私はこれを認識していない。ありがとう! –

-1

編集です。 TokenMacGuyは、getattrは、通常の属性検索が成功しない場合にのみ呼び出されると述べています。私はそれを試したが、__folderDict属性を追加するのを忘れてしまった。

getattributeメソッドがありますか?

+1

er ... no .. '__getattr__'は、通常の属性検索でキーが見つからない場合にのみ呼び出されます。無条件に '__getattribute__'だけが呼び出されます。 – SingleNegationElimination

+0

これは私の理解だった - 私はここで再帰を実行していないよ...上記の質問に答えるために –

+0

- 私はサブクラスで\ __ getattribute__をオーバーライドしていないよ –

関連する問題