Advertisement
aeris

Duck typing problem

Oct 10th, 2011
602
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.41 KB | None | 0 0
  1. class Duck( object ):
  2.     pass
  3.  
  4. class Farm:
  5.     ducks = []
  6.  
  7.     def addDuck(self, duck):
  8.         getattr(duck, 'fly')
  9.         getattr(duck, 'quack')
  10.         getattr(duck, 'swim')
  11.  
  12.         self.ducks.append(duck)
  13.         print "Add a duck"
  14.  
  15. aRealDuck = Duck()
  16. setattr(aRealDuck, 'fly', 1)
  17. setattr(aRealDuck, 'quack', 1)
  18. setattr(aRealDuck, 'swim', 1)
  19. setattr(aRealDuck, 'feathers', 1)
  20.  
  21. aFakeDuckWithoutFeathers = Duck()
  22. setattr(aFakeDuckWithoutFeathers, 'fly', 1)
  23. setattr(aFakeDuckWithoutFeathers, 'quack', 1)
  24. setattr(aFakeDuckWithoutFeathers, 'swim', 1)
  25.  
  26. f = Farm()
  27. f.addDuck(aRealDuck)
  28. f.addDuck(aFakeDuckWithoutFeathers) # No error!!!!
  29.  
  30. # ... 15.000 lines and 2 years later, ducks go to slaughter ...
  31.  
  32. class Slaughter:
  33.     feathers = 0
  34.  
  35.     def cleanDuck(self, duck):
  36.         self.removeFeathers(duck)
  37.         print "Duck dead =("
  38.  
  39.     def removeFeathers(self, duck):
  40.         getattr(duck, 'feathers')
  41.  
  42.         self.feathers += duck.feathers
  43.         duck.feathers = 0
  44.         print "Feathers removed"
  45.  
  46. s = Slaughter()
  47. for c in f.ducks:
  48.     s.cleanDuck(c) # Crash...
  49.  
  50. #Add a duck
  51. #Add a duck
  52. #Feathers removed
  53. #Duck dead =(
  54. #Traceback (most recent call last):
  55. #   File "/home/nicolas/duck.py", line 48, in <module>
  56. #   s.cleanDuck(c) # Crash...
  57. #   File "/home/nicolas/duck.py", line 36, in cleanDuck
  58. #   self.removeFeathers(duck)
  59. #   File "/home/nicolas/duck.py", line 40, in removeFeathers
  60. #   getattr(duck, 'feathers')
  61. #   AttributeError: 'Duck' object has no attribute 'feathers'
  62.    
  63.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement