Beruflich Dokumente
Kultur Dokumente
Contents
What Is Polymorphism?
Creating Polymorphic
Classes
Polymorphism with a
Function
Conclusion
Mark as Complete
Lisa Tagliaferri
Introduction
Polymorphism is the ability to leverage the same interface for different underlying forms such as data
types or classes. This permits functions to use entities of different types at different times.
For object-oriented programming in Python, this means that a particular object belonging to a particular
class can be used in the same way as if it were a different object belonging to a different class.
Polymorphism allows for flexibility and loose coupling so that code can be extended and easily maintained
over time.
What Is Polymorphism?
Polymorphism is an important feature of class definition in Python that is utilized when you have commonly
named methods across classes or subclasses. This allows functions to use objects of any of these
polymorphic classes without needing to be aware of distinctions across the classes.
Polymorphism can be carried out through inheritance, with subclasses making use of base class methods
or overriding them.
Python’s duck typing, a special case of dynamic typing, uses techniques characteristic of polymorphism,
including late binding and dynamic dispatch. The term “duck typing” is derived from a quote of writer
James Whitcomb Riley: “When I see a bird that walks like a duck and swims like a duck and quacks like a
duck, I call that bird a duck.” Appropriated by Italian computer engineer Alex Martelli in a message to the
comp.lang.python newsgroup, the use of duck typing is concerned with establishing the suitability of an
object for a specific purpose. When using normal typing this suitability is determined by the type of an
object alone, but with duck typing the presence of methods and properties are used to determine
suitability rather than the actual type of the object in question. That is to say, you check whether the object
quacks like a duck and walks like a duck rather than asking whether the object is a duck.
When several classes or subclasses have the same method names, but different implementations for
these same methods, the classes are polymorphic because they are using a single interface to use with
entities of different types. A function will be able to evaluate these polymorphic methods without knowing
which classes are invoked.
We’ll create a Shark class and a Clownfish class, each of which will define methods for swim() ,
swim_backwards() , and skeleton() .
polymorphic_fish.py
class Shark():
def swim(self):
print("The shark is swimming.")
def swim_backwards(self):
print("The shark cannot swim backwards, but can sink backwards.")
def skeleton(self):
print("The shark's skeleton is made of cartilage.")
class Clownfish():
def swim(self):
print("The clownfish is swimming.")
def swim_backwards(self):
print("The clownfish can swim backwards.")
def skeleton(self):
print("The clownfish's skeleton is made of bone.")
In the code above, both the Shark and Clownfish class have three methods with the same name in
common. However, each of the functionalities of these methods differ for each class.
polymorphic_fish.py
...
sammy = Shark()
sammy.skeleton()
casey = Clownfish()
casey.skeleton()
When we run the program with the python polymorphic_fish.py command, we can see that each
object behaves as expected:
Output
The shark's skeleton is made of cartilage.
The clownfish's skeleton is made of bone.
Now that we have two objects that make use of a common interface, we can use the two objects in the
same way regardless of their individual types.
polymorphic_fish.py
...
sammy = Shark()
casey = Clownfish()
We have two objects, sammy of the Shark class, and casey of the Clownfish class. Our for loop
iterates through these objects, calling the swim() , swim_backwards() , and skeleton() methods on
each.
Output
The shark is swimming.
The shark cannot swim backwards, but can sink backwards.
The shark's skeleton is made of cartilage.
The clownfish is swimming.
The clownfish can swim backwards.
The clownfish's skeleton is made of bone.
The for loop iterated first through the sammy instantiation of the Shark class, then the casey object of
the Clownfish class, so we see the methods related to the Shark class first, then the Clownfish
class.
This shows that Python is using these methods in a way without knowing or caring exactly what class type
each of these objects is. That is, using these methods in a polymorphic way.
Let’s create a function called in_the_pacific() which takes in an object we can call fish . Though we
are using the name fish , any instantiated object will be able to be called into this function:
polymorphic_fish.py
…
def in_the_pacific(fish):
Next, we’ll give the function something to do that uses the fish object we passed to it. In this case we’ll
call the swim() methods, each of which is defined in the two classes Shark and Clownfish :
polymorphic_fish.py
...
def in_the_pacific(fish):
fish.swim()
Next, we’ll create instantiations of both the Shark and Clownfish classes if we don’t have them already.
With those, we can call their action using the same in_the_pacific() function:
polymorphic_fish.py
...
def in_the_pacific(fish):
fish.swim()
sammy = Shark()
casey = Clownfish()
in_the_pacific(sammy)
in_the_pacific(casey)
Output
The shark is swimming.
The clownfish is swimming.
Even though we passed a random object ( fish ) into the in_the_pacific() function when defining it,
we were still able to use it effectively for instantiations of the Shark and Clownfish classes. The casey
object called the swim() method defined in the Clownfish class, and the sammy object called the
swim() method defined in the Shark class.
Conclusion
By allowing different objects to leverage functions and methods in similar ways through polymorphism,
making use of this Python feature provides greater flexibility and extendability of your object-oriented
code.
Tutorial Series
Show Tutorials
Show Tutorials
READ MORE
Related Tutorials
How To Install and Configure pgAdmin 4 in Server Mode
How To Build a Neural Network to Recognize Handwritten Digits with TensorFlow
How to Install, Run, and Connect to Jupyter Notebook on a Remote Server
How To Set Up a Jupyter Notebook with Python 3 on Debian 9
How To Set Up Django with Postgres, Nginx, and Gunicorn on Debian 9
4 Comments
Leave a comment...
0 IMO you are conflating the two distinct concepts of duck typing and polymorphism . What you have
outlined in your examples strike me as just examples of the usage of duck typing and NOT polymorphism
(and in python [not sure about other duck typed languages] I am not even sure if it even makes sense to
describe polymorphism). In a language like C++, polymorphism was achieved vie inheritance and overriding
parent methods in child objects. Doing the same in python strikes me just as simple inheritance.
http://stackoverflow.com/questions/11502433/what-is-the-difference-between-polymorphism-and-duck-
typing.
However... if the behavior quacks like polymorphism, walks like polymorphism... then..
Reply • Report
0 Hi Lisa,
We have project tutorials that we are continuously rolling out that you may want to work with, that will
cover several of the things we go over in the reference tutorials. They are at various levels of complexity
and we're increasingly covering more advanced topics across several different fields (web development,
data analysis, etc.). You can look through these project tutorials, which include both Python and
JavaScript, with more to come in the future :)
Reply • Report
Copyright © 2018 DigitalOcean™ Inc.
Distros & One-Click Apps Terms, Privacy, & Copyright Security Report a Bug Write for DOnations Shop