python : __getattr__ : 存在しないメソッドの処理

hdknr@LennyOne:~/djopenid/djopenid$ more x.py
class Creature:
   def __getattr__(self,attr):
      if attr[:2] == ‘__’ or ( attr in dir(self)):
          raise AttributeError(‘Attribute %r not found’ % (attr,))
      else:
          return self.wildcard

   def wildcard(self,*var):
      print locals()

if __name__ == ‘__main__’:
    c=Creature()
    c.xx_fdsafas(1,2,3)
    c.xx_xxxxxxx(1,2,3)
    c.xx_fdsafdsafdsafdsafdsafdsafdasfdsafsdafsdaf(1,2,3)
    c.__x__(3)

hdknr@LennyOne:~/djopenid/djopenid$ python x.py
{’var’: (1, 2, 3), ‘self’: <__main__.Creature instance at 0xb7d1288c>}
{’var’: (1, 2, 3), ‘self’: <__main__.Creature instance at 0xb7d1288c>}
{’var’: (1, 2, 3), ‘self’: <__main__.Creature instance at 0xb7d1288c>}
Traceback (most recent call last):
  File "x.py", line 16, in <module>
    c.__x__(3)
  File "x.py", line 4, in __getattr__
    raise AttributeError(‘Attribute %r not found’ % (attr,))
AttributeError: Attribute ‘__x__’ not found

 

動的に関数を追加したり。

hdknr@LennyOne:~/djopenid/djopenid$ cat x.py
class Creature:
   def __getattr__(self,attr):
      if attr[:2] == ‘__’ or ( attr in dir(self)):
          raise AttributeError(‘Attribute %r not found’ % (attr,))
      else:
          def deco(*vars):
             return "***** " + str(self.wildcard(vars)) + " *******"
          setattr(self,attr , deco )
          return deco

   def wildcard(self,*vars):
      return locals()

if __name__ == ‘__main__’:
    c=Creature()
    print c.xx_fdsafas(1,2,3)
    print c.xx_xxxxxxx(1,2,3)
    print c.xx_fdsafdsafdsafdsafdsafdsafdasfdsafsdafsdaf(1,2,3)

hdknr@LennyOne:~/djopenid/djopenid$ python x.py
***** {’self’: <__main__.Creature instance at 0xb7db38ec>, ‘vars’: ((1, 2, 3),)} *******
***** {’self’: <__main__.Creature instance at 0xb7db38ec>, ‘vars’: ((1, 2, 3),)} *******
***** {’self’: <__main__.Creature instance at 0xb7db38ec>, ‘vars’: ((1, 2, 3),)} *******

カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中