| @ -0,0 +1,48 @@ | |||||
| # 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() | |||||