Classes are everywhere

Copied to clipboard.
Series: Classes
Trey Hunner smiling in a t-shirt against a yellow wall
Trey Hunner
3 min. read Watch as video Python 3.8—3.12
Python Morsels
Watch as video

Classes are everywhere in Python. Even if you never define your own type of class, you will certainly use classes in Python.

Using a class object

We've imported class Point here, that we're calling. When you call a class, you get back an instance of that class:

>>> from point import Point
>>> p = Point(1, 2, 3)

We can access the x attribute? on this Point object (aka Point instance) or call the is_origin method on it:

>>> p.x
>>> p.is_origin()

Python data structures are classes

When we check the type of p (which is a Point instance) it will tell us I am an object of type "class Point":

>>> type(p)
<class 'point.Point'>

The type of something is the same as the class of that thing.

Class instances (aka objects of some class/type) can have attributes and they can have methods. We've seen attributes and methods in other places in Python too. For example, lists have an append method:

>>> numbers = [1, 2, 3]
>>> numbers.append(4)
>>> numbers
[1, 2, 3, 4]

If you ask lists for their type, you'll see some kind of class. You always get a class when you ask for the type of something in Python:

>>> type(numbers)
<class 'list'>

The type of a list is the list class. So list is not a function in Python, it's a class. When you call list with parentheses after it, you get an empty list back because we're constructing a new object of type list:

>>> list()

All the built-in data structures in Python are classes:

>>> tuple
<class 'tuple'>
>>> dict
<class 'dict'>
>>> set
<class 'set'>

Everything that has a "type" has a "class"

Interestingly, some of the even more fundamental types of objects are actually classes.

Anything that has a type has a class.

When you ask for the type of a string you'll see str:

>>> name = "Trey"
>>> type(name)
<class 'str'>

We may have thought of str as a function that can convert something to a string:

>>> str(4)

But it's actually a class!

int is also a class:

>>> x = 4
>>> type(x)
<class 'int'>

in fact, there are even attributes we can access on instances of the int class:

>>> x.real
>>> x

We're accessing the real attribute of object to get the real component of this number, which is the same as the number itself.

So, Integers are a class, which means if we call the int function, we're actually calling a class to get back an integer instance:

>>> int('4')

Many built-in functions are classes

A lot of the built-in functions in Python are actually classes too.

For example, when we call the enumerate function, we'll get back an enumerate object:

>>> enumerate(numbers)
<enumerate object at 0x7f58e8228c00>

The enumerate "function" is actually a class:

>>> enumerate
<class 'enumerate'>

It's not incorrect to say "the enumerate function" even though enumerate is implemented as a class because the distinction between classes and functions isn't very important in Python.


The distinction between classes and functions doesn't really matter that much in Python. The thing that I care about is the behavior: I care that I can call it.

When you call a function, we'll get the return value of that function. When you call a class, we'll get an instance of that class. Both functions and classes are callables and that's the thing we usually care about ("can I call it?").

So classes are everywhere in Python! Even if you never make your own class, you will certainly use classes.

A Python Tip Every Week

Need to fill-in gaps in your Python skills? I send weekly emails designed to do just that.

Python Morsels
Watch as video