Here is a horrible solution. I could make it thread-safe by adding +30 lines. There must be a better solution.
class TemplateItem(object): def __init__(self,name): self.name = name self.items = [] def __getattr__(self,name): self._getattr_was_called = True for item in self.items: if hasattr(item,'name') and item.name == name: return item raise AttributeError("%s: attribute or item does not exists."%name) def getrealattr(self,name): self._getattr_was_called = False res = getattr(self,name) if self._getattr_was_called: raise AttributeError def hasrealattr(self,name): try: self.getrealattr(name) return True except AttributeError: return False def __str__(self): return "TemplateItem('%s')"%self.name class CustomTemplateItem(TemplateItem): pass # I could have been customized this... root = CustomTemplateItem('root') root.items.append(CustomTemplateItem('item1')) root.items.append(CustomTemplateItem('item2')) TemplateItem.item3 = TemplateItem('item3') print hasattr(root,'item1') # True print hasattr(root,'item3') # True print root.hasrealattr('item1') # False print root.hasrealattr('item3') # True Any ideas? -- Laszlo -- http://mail.python.org/mailman/listinfo/python-list