Python Classes and Objects - Get to know how classes and objects work!
Tags: programming, tutorial, python, beginners
Published: 2022-12-24 19:30:48

Python is a high level  and an object oriented programming language.
In python classes are used to construct objects, thus a class is a code template for creating objects.

A class being a blueprint for an object creation, it is a form of data structure that is user-defined, binding an objects data members and its methods in a single unit.

An object on the other hand is an instance of a class. Objects have states and behaviors. The state of an object represents its attributes and the behavior its methods.
An object must also have an identity in order of it to be identified uniquely.
Hence an object must have identity, state and behavior.

A real world example of a class and objects:

A car can be a class, as it is a template of a vehicle of any model, brand, different car engine size etc.
So lets define a car in a class template;

**class**: Car
**State**: model, color, brand
**Behavior**: fuel consumption

Using the class above, we can now create car objects:

<u>**First Object**</u>:

  **State**
   - **brand**: Toyota
   - **model**: Corolla
   - **color**: Blue

 **Behavior**
   - **Fuel consumption**: For every 35 kilometers it consumes 1 gallon of fuel.


<u>**Second Object** </u>:

  **State**
   - **brand**: Honda
   - **model**: Civic
   - **color**: Green

 **Behavior**
   - **Fuel consumption**: For every 40 kilometers it consumes 1 gallon of fuel.


From the first and second objects, they are both created from the same class but have different states and behaviors.

**Creating a class in python**
The keyword `class` is used in python to create a class, followed by the class name. It is best practice to have a class name with the **UpperCaseCamelCase** naming convention.

After defining the class name, the block of statements that follow for the specific class define its attributes and methods.
With python classes, there is *Docstrings* which is the first string in a class that briefly describes the class. It is not necessary but it is best practice in python classes, methods or functions to have docstrings. 

We will use the example of the car class in the code examples:

**Defining a class in Python**

```python 
class Car:
    def __init__(self, color, brand, model):
       # instance variables(state)
       self.color = color
       self.brand = brand
       self.model = model

    # behavior (instance method)
    def car_details(self):
      print(f'Car brand: {self.brand}, model: {self.model}, color: {self.color}')

    # behavior (instance method)
    def fuel_consumption(distance=10, fuel_amount=1):
      print(f'For every {distance} kilometers it consumes {fuel_amount} gallon of fuel')
   
```
The `self` keyword represents the instance of the class within itself. Meaning the class attributes and methods can be accessed within itself using the "self" keyword.

From the above class, with the `fuel_consumption` method, there are two parameters, this is to ensure that each object has its unique rate of fuel consumption based on a specific distance covered by the car object.

The `__init__` is a type of function known as a **constructor** which in python is a special method used to create and initialize an object of a class.

**Creating an object of a class**
Here is how we get to create an object of an already defined class. We will use the `Car` class that we defined above;

```python
toyota_corolla = Car(model='Corolla', brand='Toyota', color='Blue')

toyota_corolla.car_details()

```
Output:
```
Car brand: Toyota, model: Corolla, color: Blue
```

For the `fuel_consumption` method, we have to pass in the `distance` and `fuel_amount` arguments.

```python
toyota_corolla = Car(model='Corolla', brand='Toyota', color='Blue')

toyota_corolla.fuel_consumption(distance=35, fuel_amount=1)

```

Output:
```
For every 35 kilometers it consumes 1 gallon of fuel
```
When defining the `fuel_consumption` method there is a default value for both `fuel_amount` and `distance` parameters, in case there are no arguments passed in, then the default values will be used instead. The default values are `distance=10` and `fuel_amount=1`.

```python
toyota_corolla = Car(model='Corolla', brand='Toyota', color='Blue')

toyota_corolla.fuel_consumption()

```

Output:
```
For every 10 kilometers it consumes 1 gallon of fuel
```

**Class Attributes**
When designing a class, there are two types of variables, the instance variables and the class variables.

*Instance variables* - These are attributes attached to an instance class. They are variables defined in the constructor, in the `__init__` class method.
 
*Class variables* - Are attributes or variables declared in the class but outside any instance method including the `__init__` method.

When accessing a class attribute can be accessed by using a dot on an instance followed by the attribute name; `instance_name.attribute_name`.

It is in the same way that an attribute can be modified, example(using `the Car` class):

```python
toyota_corolla = Car(model='Corolla', brand='Toyota', color='Blue')

toyota_corolla.color = 'Yellow'
toyota_corolla.car_details()

```
Output:

```
Car brand: Toyota, model: Corolla, color: Yellow
```
From the above example, the Toyota Corolla's color is changed from Blue to Yellow.


**Class Methods**
With Object Oriented Programming a class can have 3 types of methods within the class:

_Static Method_: It is a general-purpose utility method that finishes just one task. We don't use instance or class variables within this static method because it doesn't have access to the class attributes.

_Class Method_: Used to access or modify the class's state. When implementing a method, if we only use class variables, we should declare that method as a class method.

_Instance Method_: Used to access or alter the status of the object. Methods are referred to as instance methods if they contain instance variables. 

A class method is linked to the class itself, not to any class objects.
Only class variables are accessible to it.