__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