DEV Community

Cover image for What are classes in python?
Ezinne Anne๐Ÿ˜Ž๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ’ป
Ezinne Anne๐Ÿ˜Ž๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ’ป

Posted on • Originally published at Medium

What are classes in python?

Python is an object-oriented programming language.ย In Python, everything is an object. All this time that you have been writing code, you have used objects. Either when you used built-in functions or the variables you created.ย  An object is any data you can assign to a variable or pass as an argument to a function or method. A method is a function passed into an object.

Check my previous article if you are yet to learn about functions in Python.

In this article, you will learn

  1. Creating a Class
  2. Inheritance
  3. Importing classes
  4. Conclusion

Classes in python text

Creating a Class

A class is an outline or layout for creating objects. You can create many objects from a class. The object you create from a class is called an instance. You could also create methods. A class is like a recipe, while the food prepared is the object. A class is a layout for creating objects, so it does not hold any actual data. You cannot pass an argument to a class, but you can to an object.

To create a class, you begin with the word class then the class name, and a colon.

This is the syntax:

class ClassName:
    ''''Creating a simple syntax'''
Enter fullscreen mode Exit fullscreen mode

Note: In Python, classes are capitalized in camel case. Eg: CamelCaseLetter

For example, if you wanted to create a class that records information about your students, you could do so.

ย 

class Student:
    '''Creating a class that records student details '''
    name = ""
    courses_complete  = 0
    certificates = 0

Enter fullscreen mode Exit fullscreen mode

After creating the class, create an object, which is called an instance of the class.
(I will be addressing it as an instance from now on to avoid any confusion.)

This is the syntax:

instance_name = ClassName()

#you do not need to capitalize the instance name or use Camel case. 
Enter fullscreen mode Exit fullscreen mode

You create the instance and assign it to the class name.

In the student record example, create the instance:

class Student:
    '''Creating a class that records student details '''
    name = ""
    courses_complete = 0
    certificates = 0


student_details = Student()


Enter fullscreen mode Exit fullscreen mode

You can change the values for the class attributes when you want to access them.

student_details.name = "Ezinne Anne Emilia"

Enter fullscreen mode Exit fullscreen mode

Now, print all the values for the attributes after modifying them.

class Student:
    '''Creating a class that records student details '''
    name = ""
    courses_complete = 0
    certificates = 0


student_details = Student()

student_details.name = "Ezinne Anne Emilia"     #modifying the value of the name attribute 

student_details.courses_complete = 2       #modifying the value of the courses_complete attribute 

student_details.certificates = 2       #modifying the value of the certificates attribute 

print(f"Student's Name: {student_details.name} \n Courses Completed: {student_details.courses_complete} \n Certificates Received: {student_details.certificates}")       #printing the values to the console


Enter fullscreen mode Exit fullscreen mode

Output

Student's Name: Ezinne Anne Emilia
 Courses Completed: 2
 Certificates Received: 2

Enter fullscreen mode Exit fullscreen mode

In the past example, you created attributes called name, courses_complete and certificates.

But to access these attributes, you had to change the values directly in the instance.

But wouldnโ€™t it be better if you used those attributes as parameters? and passed the values as arguments in the instance instead? Of course it would be. You can do that with a special method called the init method.

The init method

The init method is a constructor function. This function initializes a new instance of the class. Python requires the self parameter when initializing a new instance. So when you create an instance, Python will automatically pass the self parameter. You should surround the init method with double underscores. So the Python interpreter does not misinterpret it as a different method.

This is the syntax:

def __init__(self, attribute1, attribute2):
    self.attribute1 = attribute1
    self.attribute2 = attribute2

Enter fullscreen mode Exit fullscreen mode

Now, use the init method in the Student class example

class Student:
    '''Creating a class that records student details'''

    def __init__(self,name,courses_complete,certificates):
        '''Initializing the attributes for the class instance'''
        self.name = name
        self.courses_complete = courses_complete
        self.certificates = certificates


student_details = Student('Ezinne Anne Emilia',2,2)  # there's no  argument for the self parameter


print(f"Student's Name: {student_details.name} \n Courses Completed: {student_details.courses_complete} \n Certificates Received: {student_details.certificates}")

Enter fullscreen mode Exit fullscreen mode

Output

Student's Name: Ezinne Anne Emilia
 Courses Completed: 2
 Certificates Received: 2

Enter fullscreen mode Exit fullscreen mode

This makes the code cleaner, right?

Now, if you noticed when I filled in the arguments for the class, Student. I didnโ€™t add an argument for the self parameter. This is due to the Python interpreter passing the self parameter to the student_details instance.

Now, you can add more methods to the code.

In the code example, you can add features that indicate when a student has started a course. And when a student has finished a course,

class Student:
    '''Creating a class that records student details '''

    def __init__(self,name,courses_complete,certificates):
        '''Initializing the attributes for the class instance'''
        self.name = name
        self.courses_complete = courses_complete
        self.certificates = certificates



    def start(self):
        '''Creating a method that indicates when a student starts a course'''
        print(f'This student: {self.name} has started a course')



    def complete(self):
        '''Creating a method that indicates when a student completes a course'''
        print(f'This student: {self.name} has completed a course')



student_details = Student('Ezinne Anne Emilia',2,2)


print(f"Student's Name: {student_details.name} \n Courses Completed: {student_details.courses_complete} \n Certificates Received: {student_details.certificates}")

Enter fullscreen mode Exit fullscreen mode

When creating the methods (start and complete), you added the self parameter to them. This makes the attributes initialized in the constructor function available in the methods, too.

But you can add more parameters to the method after you add the self parameter.

...

    def start(self,prev_record):
        '''Creating a method that indicates when a student starts a course'''
        prev_record = 0
        print(f'This student: {self.name} has started a course \n Previous record = {prev_record}')
...        

Enter fullscreen mode Exit fullscreen mode

Calling the class instance

To call the methods that you created, you use the name of the instance and the name of the method.

This is the syntax:

instance_name.method_name()

Enter fullscreen mode Exit fullscreen mode

To call the methods in the Student class.

class Student:
    '''Creating a class that records student details '''

    def __init__(self,name,courses_complete,certificates):
        self.name = name
        self.courses_complete = courses_complete
        self.certificates = certificates



    def start(self,prev_record):
        '''Creating a method that indicates when a student starts a course'''
        prev_record = 0
        print(f'This student: {self.name} has started a course \n Previous record = {prev_record}')



    def complete(self):
        '''Creating a method that indicates when a student completes a course'''
        print(f'This student: {self.name} has completed a course')



student_details = Student('Ezinne Anne Emilia',2,2)


print(f"Student's Name: {student_details.name} \n Courses Completed: {student_details.courses_complete} \n Certificates Received: {student_details.certificates}")

student_details.start(0)

student_details.complete()


Enter fullscreen mode Exit fullscreen mode

Output

Student's Name: Ezinne Anne Emilia
 Courses Completed: 2
 Certificates Received: 2
This student: Ezinne Anne Emilia has started a course
 Previous record = 0
This student: Ezinne Anne Emilia has completed a course

Enter fullscreen mode Exit fullscreen mode

Setting A Default Value

You could set a default value for an attribute without adding it as a parameter.

For example, if you wanted to record courses completed

You could create a default value in the constructor function.

class Student:
    '''Creating a class that records student details '''

    def __init__(self,name,courses_complete,certificates):
        self.name = name
        self.courses_complete = courses_complete
        self.certificates = certificates
        self.previous_record = 0


    ...

    def previous_courses(self):
        '''creating a method that records previous courses done'''
        print(f'Previous record: {self.previous_record}')


    ...


student_details.previous_courses()
Enter fullscreen mode Exit fullscreen mode

You can modify previous_record directly like this:

student_details.previous_record = 1
student_details.previous_courses()
Enter fullscreen mode Exit fullscreen mode

Instead of modifying it directly, you could also change the attribute through a method instead.

class Student:
    '''Creating a class that records student details '''

    def __init__(self,name,courses_complete,certificates):
        self.name = name
        self.courses_complete = courses_complete
        self.certificates = certificates
        self.previous_record = 0

    ...

    def update_previous_courses(self,updated_record):
        '''Creating a method to update previous courses done'''
        if updated_record != self.previous_record:
            self.previous_record = updated_record
        else:
            print('recorded')            
    ...


student_details.update_previous_courses(2)

student_details.previous_courses()

Enter fullscreen mode Exit fullscreen mode

Inheritance

This is when the child class inherits the properties of the parent class. If you created a class called User and you wanted to create another class called UserProfile, you could inherit the properties of the parent class instead of writing the code from scratch.

This is the syntax:

class Parent:
    '''Creating a parent class'''


class Child(Parent):
    '''Creating a child class'''

    def __init__(self,param1,param2):
        '''Initializing'''
        super().__init__(parent_param1,parent_param2)


Enter fullscreen mode Exit fullscreen mode

Inheriting from the parent

In the child class, you use the super method to initialize the attributes of the parent class.

In this example, the UserProfile class will inherit the attributes of the User class.

class User:
    '''creating a class for a user login attempts'''

    def __init__(self,device,ip_address):
        '''fixing the attributes for the user'''
        self.device = device   #attribute for the user's device
        self.ip_address = ip_address    #attribute for the user's ip address
        self.login_attempts = 0    #attribute for the user's login attempts


    def register(self):
        '''creating a method that describes the user's registration'''
        print(f'This user has been registered successfully')


    def location(self):
        '''creating a method that describes the user's location'''
        print(f'This {device} is located at the Northern hemisphere')


    def failed_logins(self):
        '''creating a method that records login attempts'''
        print(f'This user has {self.login_attempts} login attempts')


class UserProfile(User):
    '''Creating a child class UserProfile that will inherit some of the attributes of the parent class User'''


    def __init__(self,device,ip_address):
        '''Initializing the attributes of the parent class'''
        super().__init__(device,ip_address) 


user_profile = User('HuaweiX605','192.21.0.0')     #assigning the arguments
print(f'This user is using a mobile device: {user_profile.device}\n Address: {user_profile.ip_address}')
user_profile.failed_logins()

Enter fullscreen mode Exit fullscreen mode

You could add new attributes and methods to a child's class. In this example, you could add the name, age and username of the user and a method to describe the user profile.

class User:
    '''creating a class for a user login attempts'''

    def __init__(self,device,ip_address):
        '''fixing the attributes for the user'''
        self.device = device   #attribute for the user's device
        self.ip_address = ip_address    #attribute for the user's ip address
        self.login_attempts = 0    #attribute for the user's login attempts


    def register(self):
        '''creating a method that describes the user's registration'''
        print(f'This user has been registered successfully')


    def location(self):
        '''creating a method that describes the user's location'''
        print(f'This {self.device} is located at the Northern hemisphere')


    def failed_logins(self):
        '''creating a method that records login attempts'''
        print(f'This user has {self.login_attempts} login attempts')



class UserProfile(User):
    '''Creating a child class UserProfile that will inherit some of the attributes of the parent class User'''

    def __init__(self,device,ip_address,name,age,username):   #adding new attributes to the child class
        '''initializing the attribute of the parent in the child class'''
        super().__init__(device,ip_address)
        self.name = name
        self.age = age
        self.username = username



    def describe_user(self):
        '''describing a user'''
        print(f'User details: \n Name: {self.name} \n Age: {self.age} \n Username: {self.username}')


user_profile = UserProfile('Gionee360','197.60.12.3','Ezinne',16,'ezin5y')      #assigning the arguments
user_profile.location()       #calling the method of the parent class on the child class
user_profile.describe_user()

Enter fullscreen mode Exit fullscreen mode

Output

This Gionee360 is located at the Northern hemisphere
User details:
 Name: Ezinne
 Age: 16
 Username: ezin5y
Enter fullscreen mode Exit fullscreen mode

Importing classes

In python, you can import classes in your code.

You can import a single class.

Syntax:

from file_name import ClassName
Enter fullscreen mode Exit fullscreen mode

Command:

from user import User
Enter fullscreen mode Exit fullscreen mode

You can import multiple classes from a file into the current code you are writing.

Syntax:

from file_name import ClassName1, ClassName2

instance_name = ClassName('attribute1','attribute2')

Enter fullscreen mode Exit fullscreen mode

Command:

from user import User, UserProfile

user1 = User('device','address')
Enter fullscreen mode Exit fullscreen mode

You can also import the whole file by specifying the file name.

Syntax:

import file_name
Enter fullscreen mode Exit fullscreen mode

Command:

import user
Enter fullscreen mode Exit fullscreen mode

To import all classes from a file into your present code.

Syntax:

from file_name import *
Enter fullscreen mode Exit fullscreen mode

Command:

from user import *
Enter fullscreen mode Exit fullscreen mode

To import a file and give it another name or alias

Syntax:

from file_name import ClassName as CN
Enter fullscreen mode Exit fullscreen mode

Command:

from user import UserProfile as UP
Enter fullscreen mode Exit fullscreen mode

Conclusion

By the end of this article, you will have learned about OOP in Python, how to create a class, the init method and methods, creating an instance, and how to import classes. You could try to repeat the initial exercises using the user login class this time around.

Top comments (2)

Collapse
 
iamheroforfun profile image
IAmHeroForFun

The post was very useful for a beginner like me. THANK YOU

Collapse
 
ezinne_anne profile image
Ezinne Anne๐Ÿ˜Ž๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ’ป

Am glad you liked it