| # duck typing example taken from wikipedia | |
| # https://de.wikipedia.org/wiki/Duck-Typing | |
| 
 | |
| 
 | |
| class Bird: | |
|     """Birds have a name that they return in string represention""" | |
| 
 | |
|     def __init__(self, name): | |
|         self.name = name | |
| 
 | |
|     def __str__(self): | |
|         return self.__class__.__name__+' '+self.name | |
| 
 | |
| 
 | |
| class Duck(Bird): | |
|     """Ducks are birds which can quak""" | |
| 
 | |
|     def quak(self): | |
|         print(str(self)+': quak') | |
| 
 | |
| 
 | |
| class Frog: | |
|     """Frogs also can quak""" | |
| 
 | |
|     def quak(self): | |
|         print(str(self)+': quak') | |
| 
 | |
| 
 | |
| def main(): | |
| 
 | |
|     ducks = [Bird('Gustav'), Duck('Donald'), object()] | |
|     for duck in ducks: | |
|         # exception handling when object hasn't quak method | |
|         try: | |
|             duck.quak() | |
|         except AttributeError: | |
|             print('No duck:', duck) | |
| 
 | |
|     ducks.append(Frog()) | |
|     for duck in ducks: | |
|         # we also can use hasattr() function instead of exception handling | |
|         if hasattr(duck, 'quak'): | |
|             duck.quak() | |
|         else: | |
|             print('No duck:', duck) | |
| 
 | |
| 
 | |
| if __name__ == "__main__": | |
|     main()
 |