|
|
@ -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() |