# A Smooth Refresher on Python's Classes and Objects

This post is part of a series called A Smooth Refresher To Python.
A Smooth Refresher on Python's Functions
A Smooth Refresher on Python's Modules

Python comes with many built-in data types, such as dict, list, set, etc. Have you ever wondered if you can create your own data types? Like person, car, university, etc.? Would creating such data types be possible? Yes, that is certainly possible in Python, and this is where classes and objects come into play.

In this tutorial, I'm going to describe what is meant by a class and an object, and how we can work with them in Python.

## Classes and Objects

As mentioned above, classes and objects are about creating your own data type (i.e. user-defined data types). A class is thus a user-defined data type, and creating instances of a class (instantiation) means creating objects of that type. At the end of the day, classes and objects are considered the main building blocks for Python, which is an object-oriented programming language.

What would it be like to create a class in Python? The simplest class structure in Python looks as follows:

As you can see, defining a class starts with the class keyword, and className is the name of the class (identifier). Keep in mind that the class name follows the same rules as variable names in Python, that is the name can only start with a letter or underscore _, and can only contain letters, numbers. or underscores. Also, referring to PEP 8 (Style Guide for Python Code), we can see that it is recommended to name classes in CapWords (upper CamelCase) style.

Let's now define a class Person, which at the moment will not contain anything, except the pass statement. As mentioned in Python's documentation:

The pass statement does nothing. It can be used when a statement is required syntactically but the program requires no action

In order to create an instance (object) of this class, we can simply do the following:

abder =  Person()

This means that we have created a new object abder of type Person. Notice that creating an object is simply having the class name followed by parentheses.

We can identify which type abder is, and where it belongs in memory by typing: print abder. In this case, you will get something like the following:

<__main__.Person instance at 0x109a1cb48>

## Attributes

Attributes are like properties we want to add to the class (type). For instance, for our class Person, let's add two attributes: name and school, as follows:

Now, we can create a new object of type Person (instance of Person) with more details, since it now has some attributes, as follows:

## Methods

Methods are like functions in Python, in that they are defined with the keyword def and have the same formatting as functions. In our class, let's define a method that prints the person's name and school. The class will look as follows:

I mentioned above that methods are like functions. But the main difference is that methods need to have an argument conveniently named self, which refers to the object the method is being called on (i.e. abder). Notice that in calling the method we don't need to pass self as an argument, as Python will handle that for us.

If we don't put self as an argument in print_name(), here is how Python will complain:

You can of course pass more than one argument to the method. Let's make the process of printing the name and school in one method, as follows:

Try and run the program—did you get the same output as before?

## Initialization

In the previous section, we initialized name and school by giving them an empty value ' '. But there is a more elegant way of initializing variables to default values, and here is where initialization comes in handy.

The initializer is a special method with the name __init__ (the method is considered special and will be treated in a special case, and that is why there are double underscores at the beginning and at the end).

Let's modify the previous program to use the initializer. In this case, the program will look as follows:

Notice that the initializer here needs to have two arguments. For instance, if we don't include the n argument in the initializer, we will get the following error:

So the bottom line is that with classes you will be able to create your own data types, and with objects you will be able to create instances of those data types. Classes are also composed of attributes (properties) and methods that are actions we perform on those attributes.

What was that data type you always wanted to create? Go ahead and do it!