__getattr__ question

Laszlo Nagy gandalf at designaproduct.biz
Fri Jun 9 14:27:19 EDT 2006


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



More information about the Python-list mailing list