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 A(object):
  15. foo1 = MyDesc()
  16.  
  17. class MyObj(A):
  18.  
  19. foo = MyDesc()
  20.  
  21. def __init__(self, bar):
  22. object.__setattr__(self, 'names', dict(
  23. bar=bar,
  24. ))
  25. object.__setattr__(self, 'new_names', dict())
  26.  
  27. # def __setattr__(self, name, value):
  28. # print "MyObj.__setattr__ for %s" % name
  29. # for cls in self.__class__.__mro__ + (self, ):
  30. # if name in cls.__dict__:
  31. # return object.__setattr__(self, name, value)
  32. # print 'New name', name, value
  33. # self.new_names[name] = value
  34.  
  35. def __setattr__(self, name, value):
  36. print "MyObj.__setattr__ for %s" % name
  37. try:
  38. object.__getattribute__(self, name)
  39. except AttributeError:
  40. print 'New name', name, value
  41. self.new_names[name] = value
  42. else:
  43. object.__setattr__(self, name, value)
  44.  
  45. def __getattr__(self, name):
  46. print "MyObj.__getattr__ for %s" % name
  47.  
  48. if name in self.new_names:
  49. return self.new_names[name]
  50.  
  51. if name in self.names:
  52. return self.names[name]
  53.  
  54. raise AttributeError(name)
  55.  
  56. if __name__ == "__main__":
  57. o = MyObj('bar-init')
  58.  
  59. print o.bar
  60. o.bar = 'baz'
  61. print o.bar
  62. o.bar = 'baz2'
  63. print o.bar
  64.  
  65. o.bazbar = 'barbaz'
  66. print o.bazbar
  67.  
  68. o.foo = 'quux'
  69. print o.foo
  70.  
  71. o.foo1 = 'quux1'
  72. print o.foo1
  73.  
  74. o.bar = 'baz'
  75. print o.bar
Success #stdin #stdout 0.02s 6660KB
stdin
Standard input is empty
stdout
MyObj.__getattr__ for bar
bar-init
MyObj.__setattr__ for bar
New name bar baz
MyObj.__getattr__ for bar
baz
MyObj.__setattr__ for bar
New name bar baz2
MyObj.__getattr__ for bar
baz2
MyObj.__setattr__ for bazbar
New name bazbar barbaz
MyObj.__getattr__ for bazbar
barbaz
MyObj.__setattr__ for foo
MyDesc.__get__
MyDesc.__set__
MyDesc.__get__
quux
MyObj.__setattr__ for foo1
MyDesc.__get__
MyDesc.__set__
MyDesc.__get__
quux1
MyObj.__setattr__ for bar
New name bar baz
MyObj.__getattr__ for bar
baz