Object-Oriented Programming (OOP) in Python 3
Object-Oriented Programming (OOP) in Python 3
An object contains data, like the raw or preprocessed materials at each step on an
assembly line. In addition, the object contains behavior, like the action that each
— FREE Email Series — assembly line component performs.
Note: You can also check out the Python Basics: Object-Oriented Programming
video course to reinforce the skills that you’ll develop in this section of the
tutorial.
Remove ads
The key takeaway is that objects are at the center of object-oriented programming in
Watch NowThis tutorial has a related video course created by the Real Python. In other programming paradigms, objects only represent the data. In OOP,
Python team. Watch it together with the written tutorial to deepen your they additionally inform the overall structure of the program.
understanding: Intro to Object-Oriented Programming (OOP) in Python
Conceptually, objects are like the components of a system. Think of a program as a Help
factory assembly line of sorts. At each step of the assembly line, a system
component processes some material, ultimately transforming raw material into a
How Do You Define a Class in Python? Put another way, a class is like a form or questionnaire. An instance is like a form
that you’ve filled out with information. Just like many people can fill out the same
In Python, you define a class by using the class keyword followed by a name and a form with their own unique information, you can create many instances from a
colon. Then you use .__init__() to declare which attributes each instance of the single class.
class should have:
Primitive data structures—like numbers, strings, and lists—are designed to represent class Dog:
straightforward pieces of information, such as the cost of an apple, the name of a pass
poem, or your favorite colors, respectively. What if you want to represent something
more complex? The body of the Dog class consists of a single statement: the pass keyword. Python
programmers often use pass as a placeholder indicating where code will eventually
For example, you might want to track employees in an organization. You need to
go. It allows you to run this code without Python throwing an error.
store some basic information about each employee, such as their name, age,
position, and the year they started working.
Note: Python class names are written in CapitalizedWords notation by
One way to do this is to represent each employee as a list: convention. For example, a class for a specific breed of dog, like the Jack
Russell Terrier, would be written as JackRussellTerrier.
Python
kirk = ["James Kirk", 34, "Captain", 2265] The Dog class isn’t very interesting right now, so you’ll spruce it up a bit by defining
spock = ["Spock", 35, "Science Officer", 2254]
some properties that all Dog objects should have. There are several properties that
mccoy = ["Leonard McCoy", "Chief Medical Officer", 2266]
you can choose from, including name, age, coat color, and breed. To keep the
example small in scope, you’ll just use name and age.
There are a number of issues with this approach.
You define the properties that all Dog objects must have in a method called
First, it can make larger code files more difficult to manage. If you reference kirk[0]
.__init__(). Every time you create a new Dog object, .__init__() sets the initial
several lines away from where you declared the kirk list, will you remember that the
state of the object by assigning the values of the object’s properties. That is,
element with index 0 is the employee’s name?
.__init__() initializes each new instance of the class.
Second, it can introduce errors if employees don’t have the same number of
You can give .__init__() any number of parameters, but the first parameter will
elements in their respective lists. In the mccoy list above, the age is missing, so
always be a variable called self. When you create a new class instance, then Python
mccoy[1] will return "Chief Medical Officer" instead of Dr. McCoy’s age.
automatically passes the instance to the self parameter in .__init__() so that
A great way to make this type of code more manageable and more maintainable is to Python can define the new attributes on the object.
use classes.
Update the Dog class with an .__init__() method that creates .name and .age
attributes:
Classes vs Instances Python
Classes allow you to create user-defined data structures. Classes define functions
# dog.py
called methods, which identify the behaviors and actions that an object created
from the class can perform with its data. class Dog:
def __init__(self, name, age):
In this tutorial, you’ll create a Dog class that stores some information about the self.name = name
characteristics and behaviors that an individual dog can have. self.age = age
A class is a blueprint for how to define something. It doesn’t actually contain any Make sure that you indent the .__init__() method’s signature by four spaces, and
data. The Dog class specifies that a name and an age are necessary for defining a the body of the method by eight spaces. This indentation is vitally important. It tells
dog, but it doesn’t contain the name or age of any specific dog. Python that the .__init__() method belongs to the Dog class.
While the class is the blueprint, an instance is an object that’s built from a class and In the body of .__init__(), there are two statements using the self variable:
contains real data. An instance of the Dog class is not a blueprint anymore. It’s an
actual dog with a name, like Miles, who’s four years old.
1. self.name = name creates an attribute called name and assigns the value of the In the output above, you can see that you now have a new Dog object at 0x106702d30.
name parameter to it. This funny-looking string of letters and numbers is a memory address that indicates
2. self.age = age creates an attribute called age and assigns the value of the age where Python stores the Dog object in your computer’s memory. Note that the
parameter to it. address on your screen will be different.
Attributes created in .__init__() are called instance attributes. An instance Now instantiate the Dog class a second time to create another Dog object:
attribute’s value is specific to a particular instance of the class. All Dog objects have a
Python >>>
name and an age, but the values for the name and age attributes will vary depending
on the Dog instance. >>> Dog()
<__main__.Dog object at 0x0004ccc90>
On the other hand, class attributes are attributes that have the same value for all
class instances. You can define a class attribute by assigning a value to a variable The new Dog instance is located at a different memory address. That’s because it’s an
name outside of .__init__(). entirely new instance and is completely unique from the first Dog object that you
created.
For example, the following Dog class has a class attribute called species with the
value "Canis familiaris": To see this another way, type the following:
Remove ads
To instantiate this Dog class, you need to provide values for name and age. If you don’t,
then Python raises a TypeError:
How Do You Instantiate a Class in Python?
Python >>>
Creating a new object from a class is called instantiating a class. You can create a
new object by typing the name of the class, followed by opening and closing >>> Dog()
Traceback (most recent call last):
parentheses:
...
TypeError: __init__() missing 2 required positional arguments: 'name' and 'age
Python >>>
so you only need to worry about the name and age parameters.
Open a new editor window in IDLE and type in the following Dog class:
Note: Behind the scenes, Python both creates and initializes a new object Python
when you use this syntax. If you want to dive deeper, then you can read the
# dog.py
dedicated tutorial about the Python class constructor.
class Dog:
species = "Canis familiaris"
After you create the Dog instances, you can access their instance attributes using dot
notation: def __init__(self, name, age):
self.name = name
Python >>>
self.age = age
>>> miles.name
# Instance method
'Miles'
def description(self):
>>> miles.age
return f"{self.name} is {self.age} years old"
4
Although the attributes are guaranteed to exist, their values can change >>> miles.description()
dynamically: 'Miles is 4 years old'
mutable, but strings and tuples are immutable. >>> names = ["Miles", "Buddy", "Jack"]
>>> print(names)
['Miles', 'Buddy', 'Jack']
Go ahead and print the miles object to see what output you get:
Remove ads
Python >>>
How Do You Inherit From Another Class in
>>> print(miles)
<__main__.Dog object at 0x00aeff70>
Python?
Inheritance is the process by which one class takes on the attributes and methods of
When you print miles, you get a cryptic-looking message telling you that miles is a another. Newly formed classes are called child classes, and the classes that you
Dog object at the memory address 0x00aeff70. This message isn’t very helpful. You derive child classes from are called parent classes.
can change what gets printed by defining a special instance method called
You inherit from a parent class by creating a new class and putting the name of the
.__str__().
parent class into parentheses:
In the editor window, change the name of the Dog class’s .description() method to
Python
.__str__():
# inheritance.py
Python
class Parent:
# dog.py hair_color = "brown"
def __str__(self):
return f"{self.name} is {self.age} years old" In this minimal example, the child class Child inherits from the parent class Parent.
Because child classes take on the attributes and methods of parent classes,
Save the file and press F5 . Now, when you print miles, you get a much friendlier Child.hair_color is also "brown" without your explicitly defining that.
output:
Note: This tutorial is adapted from the chapter “Object-Oriented Programming
Python >>>
(OOP)” in Python Basics: A Practical Introduction to Python 3. If you enjoy what
>>> miles = Dog("Miles", 4) you’re reading, then be sure to check out the rest of the book and the learning
>>> print(miles) path.
'Miles is 4 years old'
You can also check out the Python Basics: Building Systems With Classes video
Methods like .__init__() and .__str__() are called dunder methods because they course to reinforce the skills that you’ll develop in this section of the tutorial.
begin and end with double underscores. There are many dunder methods that you
can use to customize classes in Python. Understanding dunder methods is an Child classes can override or extend the attributes and methods of parent classes. In
important part of mastering object-oriented programming in Python, but for your other words, child classes inherit all of the parent’s attributes and methods but can
first exploration of the topic, you’ll stick with these two dunder methods. also specify attributes and methods that are unique to themselves.
Although the analogy isn’t perfect, you can think of object inheritance sort of like
Note: Check out When Should You Use .__repr__() vs .__str__() in Python? to
genetic inheritance.
learn more about .__str__() and its cousin .__repr__().
You may have inherited your hair color from your parents. It’s an attribute that you
If you want to reinforce your understanding with a practical exercise, then you can were born with. But maybe you decide to color your hair purple. Assuming that your
click on the block below and work on solving the challenge: parents don’t have purple hair, you’ve just overridden the hair color attribute that
you inherited from your parents:
# inheritance.py
When you’re done with your own implementation of the challenge, then you can
expand the block below to see a possible solution: class Parent:
hair_color = "brown"
When you’re ready, you can move on to the next section. There, you’ll see how to
If you change the code example like this, then Child.hair_color will be "purple".
take your knowledge one step further and create classes from other classes.
You also inherit, in a sense, your language from your parents. If your parents speak
English, then you’ll also speak English. Now imagine you decide to learn a second
language, like German. In this case, you’ve extended your attributes because you’ve
added an attribute that your parents don’t have:
Remove ads
Python Python >>>
You can simplify the experience of working with the Dog class by creating a child
Example: Dog Park class for each breed of dog. This allows you to extend the functionality that each
Pretend for a moment that you’re at a dog park. There are many dogs of different child class inherits, including specifying a default argument for .speak().
breeds at the park, all engaging in various dog behaviors.
Suppose now that you want to model the dog park with Python classes. The Dog
class that you wrote in the previous section can distinguish dogs by name and age
but not by breed. Remove ads
You could modify the Dog class in the editor window by adding a .breed attribute:
Parent Classes vs Child Classes
Python
In this section, you’ll create a child class for each of the three breeds mentioned
# dog.py above: Jack Russell terrier, dachshund, and bulldog.
class Dog:
For reference, here’s the full definition of the Dog class that you’re currently working
species = "Canis familiaris"
with:
def __init__(self, name, age, breed):
Python
self.name = name
self.age = age # dog.py
self.breed = breed
class Dog:
def __str__(self): species = "Canis familiaris"
return f"{self.name} is {self.age} years old"
def __str__(self):
Press F5 to save the file. Now you can model the dog park by creating a bunch of
return f"{self.name} is {self.age} years old"
different dogs in the interactive window:
def speak(self, sound):
Python >>> return f"{self.name} says {sound}"
Each breed of dog has slightly different behaviors. For example, bulldogs have a low To create a child class, you create a new class with its own name and then put the
bark that sounds like woof, but dachshunds have a higher-pitched bark that sounds name of the parent class in parentheses. Add the following to the dog.py file to
more like yap. create three new child classes of the Dog class:
Using just the Dog class, you must supply a string for the sound argument of .speak()
every time you call it on a Dog instance:
Python Python >>>
class Dachshund(Dog): More generally, all objects created from a child class are instances of the parent
pass class, although they may not be instances of other child classes.
class Bulldog(Dog): Now that you’ve created child classes for some different breeds of dogs, you can
pass
give each breed its own sound.
Press F5 to save and run the file. With the child classes defined, you can now
create some dogs of specific breeds in the interactive window:
# ...
>>> print(jack)
Jack is 3 years old
class JackRussellTerrier(Dog):
def speak(self, sound="Arf"):
>>> jim.speak("Woof")
return f"{self.name} says {sound}"
'Jim says Woof'
# ...
To determine which class a given object belongs to, you can use the built-in type():
Now .speak() is defined on the JackRussellTerrier class with the default argument
Python >>>
for sound set to "Arf".
>>> type(miles)
<class '__main__.JackRussellTerrier'> Update dog.py with the new JackRussellTerrier class and press F5 to save and run
the file. You can now call .speak() on a JackRussellTerrier instance without passing
What if you want to determine if miles is also an instance of the Dog class? You can do an argument to sound:
this with the built-in isinstance():
Python >>>
Sometimes dogs make different noises, so if Miles gets angry and growls, you can
Notice that isinstance() takes two arguments, an object and a class. In the example
still call .speak() with a different sound:
above, isinstance() checks if miles is an instance of the Dog class and returns True.
Python >>>
The miles, buddy, jack, and jim objects are all Dog instances, but miles isn’t a Bulldog
instance, and jack isn’t a Dachshund instance: >>> miles.speak("Grrr")
'Miles says Grrr'
One thing to keep in mind about class inheritance is that changes to the parent class Update dog.py with the new JackRussellTerrier class. Save the file and press F5
automatically propagate to child classes. This occurs as long as the attribute or so you can test it in the interactive window:
method being changed isn’t overridden in the child class.
Python >>>
For example, in the editor window, change the string returned by .speak() in the Dog >>> miles = JackRussellTerrier("Miles", 4)
class: >>> miles.speak()
'Miles barks: Arf'
Python
# dog.py Now when you call miles.speak(), you’ll see output reflecting the new formatting in
the Dog class.
class Dog:
# ...
Note: In the above examples, the class hierarchy is very straightforward. The
def speak(self, sound):
JackRussellTerrier class has a single parent class, Dog. In real-world examples,
return f"{self.name} barks: {sound}"
the class hierarchy can get quite complicated.
# ...
The super() function does much more than just search the parent class for a
method or an attribute. It traverses the entire class hierarchy for a matching
Save the file and press F5 . Now, when you create a new Bulldog instance named
method or attribute. If you aren’t careful, super() can have surprising results.
jim, jim.speak() returns the new string:
Python >>> If you want to check your understanding of the concepts that you learned about in
this section with a practical exercise, then you can click on the block below and
>>> jim = Bulldog("Jim", 5)
>>> jim.speak("Woof") work on solving the challenge:
'Jim barks: Woof'
Sometimes it makes sense to completely override a method from a parent class. But
Nice work! In this section, you’ve learned how to override and extend methods from Table of Contents
a parent class, and you worked on a small practical example to cement your new
in this case, you don’t want the JackRussellTerrier class to lose any changes that What Is Object-Oriented
skills. Programming in Python?
you might make to the formatting of the Dog.speak() output string.
How Do You Define a Class in
To do this, you still need to define a .speak() method on the child Python?
JackRussellTerrier class. But instead of explicitly defining the output string, you How Do You Instantiate a Class in
need to call the Dog class’s .speak() from inside the child class’s .speak() using the Python?
Remove ads How Do You Inherit From Another
same arguments that you passed to JackRussellTerrier.speak().
Class in Python?
You can access the parent class from inside a method of a child class by using
super():
Conclusion → Conclusion
Take the Quiz: Test your knowledge with our interactive “Object-Oriented
Programming (OOP) in Python 3” quiz. Upon completion you will receive a
score so you can track your learning progress over time:
Jacob Kate Martin
Take the Quiz »
Mark as Completed
Watch Now This tutorial has a related video course created by the Real
Master Real-World Python Skills
Python team. Watch it together with the written tutorial to deepen your With Unlimited Access to Real Python
understanding: Intro to Object-Oriented Programming (OOP) in Python
🐍 Python Tricks 💌
Get a short & sweet Python Trick delivered to your inbox every couple of
days. No spam ever. Unsubscribe any time. Curated by the Real Python
team.
Email Address
What’s your #1 takeaway or favorite thing you learned? How are you going to
David is a writer, programmer, and mathematician passionate about exploring mathematics
put your newfound skills to use? Leave a comment below and let us know.
through code.
» More about David Commenting Tips: The most useful comments are those written with the
goal of learning from or helping out other students. Get tips for asking
good questions and get answers to common questions in our support
portal.
Keep Learning
Related Tutorial Categories: intermediate python
Remove ads