fork download
  1. class MyDesc(object):
  2.  
  3. def __init__(self):
  4. self.val = None
  5.  
  6. def __get__(self, instance, owner):
  7. print "MyDesc.__get__"
  8. return self.val
  9.  
  10. def __set__(self, instance, value):
  11. print "MyDesc.__set__"
  12. self.val = value
  13.  
  14. class MyObj(object):
  15.  
  16. foo = MyDesc()
  17.  
  18. def __init__(self, bar):
  19. object.__setattr__(self, 'names', dict(
  20. bar=bar,
  21. ))
  22. object.__setattr__(self, 'new_names', dict())
  23.  
  24. def __setattr__(self, name, value):
  25. print "MyObj.__setattr__ for %s" % name
  26. try:
  27. object.__getattribute__(self, name)
  28. except AttributeError:
  29. print 'New name', name, value
  30. self.new_names[name] = value
  31. else:
  32. object.__setattr__(self, name, value)
  33.  
  34. def __getattr__(self, name):
  35. print "MyObj.__getattr__ for %s" % name
  36.  
  37. if name in self.new_names:
  38. return self.new_names[name]
  39.  
  40. if name in self.names:
  41. return self.names[name]
  42.  
  43. raise AttributeError(name)
  44.  
  45. if __name__ == "__main__":
  46. o = MyObj('bar-init')
  47. o.quux = 3
  48. print 'dict', o.__dict__
  49. print 'new_names', o.new_names
  50. print 'o.quux', o.quux
  51. print "o.new_names['quux']", o.new_names['quux']
Success #stdin #stdout 0.03s 6356KB
stdin
Standard input is empty
stdout
MyObj.__setattr__ for quux
New name quux 3
dict {'new_names': {'quux': 3}, 'names': {'bar': 'bar-init'}}
new_names {'quux': 3}
o.quux MyObj.__getattr__ for quux
3
o.new_names['quux'] 3