diff --git a/python_3_oop/chapter03/duck_typing_wikipedia.py b/python_3_oop/chapter03/duck_typing_wikipedia.py new file mode 100644 index 0000000..7a79ca2 --- /dev/null +++ b/python_3_oop/chapter03/duck_typing_wikipedia.py @@ -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()