fork download
  1. #!/usr/bin/env python
  2.  
  3. import types
  4.  
  5. def method_property(name):
  6. def getter(self):
  7. return getattr(self, name)
  8. def setter(self, value):
  9. setattr(self, name, types.MethodType(value, self))
  10. return getter, setter
  11.  
  12. class Duck(object):
  13. def __init__(self, fly, quack):
  14. self.fly = fly
  15. self.quack = quack
  16.  
  17. quack = property(*method_property("_quack"))
  18. fly = property(*method_property("_fly"))
  19.  
  20. def swim(self):
  21. print "All ducks float, even decoys!"
  22.  
  23. class MallardDuck(Duck):
  24. def __init__(self):
  25. Duck.__init__(self, fly, quack)
  26. print "I'm a real Mallard Duck"
  27.  
  28. class ModelDuck(Duck):
  29. def __init__(self):
  30. Duck.__init__(self, fly_no_way, squeak_quack)
  31. print "I'm a Model Duck"
  32.  
  33. class DecoyDuck(Duck):
  34. def __init__(self):
  35. Duck.__init__(self, fly_no_way, mute_quack)
  36. print "I'm a Decoy Duck"
  37.  
  38. def fly(self):
  39. print "I'm flying!!"
  40.  
  41. def fly_no_way(self):
  42. print "I can't fly"
  43.  
  44. def fly_rocket_powered(self):
  45. print "I'm flying with a rocket!"
  46.  
  47. def quack(self):
  48. print "Quack"
  49.  
  50. def mute_quack(self):
  51. print "<< Silence >>"
  52.  
  53. def squeak_quack(self):
  54. print "Squeak"
  55.  
  56. if __name__ == "__main__":
  57.  
  58. print '#'*80
  59. print "Mallard Duck"
  60. print '#'*80
  61. mallard = MallardDuck()
  62. mallard.quack()
  63. mallard.fly()
  64.  
  65. print '#'*80
  66. print "Model Duck"
  67. print '#'*80
  68. model = ModelDuck()
  69. model.fly()
  70. model.fly = fly_rocket_powered
  71. model.fly()
  72.  
  73. print '#'*80
  74. print "Decoy Duck"
  75. print '#'*80
  76. decoy = DecoyDuck()
  77. decoy.fly()
  78. decoy.quack()
Success #stdin #stdout 0.08s 10864KB
stdin
Standard input is empty
stdout
################################################################################
Mallard Duck
################################################################################
I'm a real Mallard Duck
Quack
I'm flying!!
################################################################################
Model Duck
################################################################################
I'm a Model Duck
I can't fly
I'm flying with a rocket!
################################################################################
Decoy Duck
################################################################################
I'm a Decoy Duck
I can't fly
<< Silence >>