Skip to main content

Python OOP

Python is an object oriented programming language. Almost everything in Python is an object, with its properties and methods.


Class:

To create a class, use the keyword class:

class MyClass: 

    x = 5


The __init__() Function

All classes have a function called __init__(), which is always executed when the class is being initiated.  Use the __init__() function to assign values to object properties, or other operations that are necessary to do when the object is being created



Python Inheritance:

Inheritance allows us to define a class that inherits all the methods and properties from another class.

Parent class is the class being inherited from, also called base class.

Child class is the class that inherits from another class, also called derived class.


Python Polymorphism:

The word "polymorphism" means "many forms", and in programming it refers to methods/functions/operators with the same name that can be executed on many objects or classes.




Types of Polymorphism:

1. Compile-time Polymorphism : It is also known as static polymorphism. This type of polymorphism is achieved by function overloading or operator overloading.

2. Runtime Polymorphism : the compiler resolves the object at run time and then it decides which function call should be associated with that object. It is also known as dynamic or late binding polymorphism. This type of polymorphism is executed through virtual functions and function overriding

Example:




Abstraction: Abstraction is the process of hiding the implementation details and show only the functionality to the user



Encapsulation: Puts restrictions on accessing variables and methods directly and can prevent the accidental modification of data.


Dependency Injection (DI) in Python:

Dependency Injection is a design pattern where an object receives its dependencies instead of creating them. This makes code more modular, testable, and flexible.


Example Without DI (Tightly Coupled)



🔴 Problem: UserService is tightly coupled with EmailService, making testing and modification difficult.


Example With DI (Loosely Coupled):


✅ Benefits of Dependency Injection:

  • Loose coupling (easier to replace dependencies).
  • Easier unit testing (can mock dependencies).
  • More flexible (swap dependencies without changing code).




Comments

Popular posts from this blog

Implementing Advance Query Optimization in Django ORM

 Django's ORM makes database interactions seamless, allowing developers to write queries in Python without raw SQL. However, as applications scale, inefficient queries can slow down performance, leading to high latency and database load.  This guide explores advanced query optimization techniques in Django ORM to go beyond basic CRUD (Create, Read, Update, Delete) operations and improve efficiency.  1. Use QuerySet Caching to Avoid Repeated Queries Using cache reduces redundant queries for frequently accessed data. Caching helps reduce repeated database hits. 2. Avoid .count() on Large Datasets Using .count() on large tables can be expensive Inefficient way: Optimized way ( .exists() is Faster) 3. Use Indexes for Faster Lookups Indexes speed up queries on frequently filtered fields. Add db_index=True for frequently queried fields: 4. Optimize Bulk Inserts and Updated Performing operations on multiple records one by one is inefficient. Use bulk_create() for mass insert...

Database Indexing in Django application

  Database Indexing Database indexing is a technique used to optimize the performance of database queries by allowing the database management system (DBMS) to quickly locate and retrieve specific rows of data. Indexes are data structures that provide a faster way to look up records based on the values stored in one or more columns of a table. When you create an index on a table, the DBMS creates a separate data structure that maps the values in the indexed columns to the corresponding rows in the table. Default Type of Index is B-Tree Index ( The king of all indexes) āĻŦāχāϤ⧇ āϕ⧋āύ āϟāĻĒāĻŋāĻ• āϖ⧁āϜāϤ⧇ āϗ⧇āϞ⧇ āφāĻŽāϰāĻž āĻŸā§‡āĻŦāĻŋāϞ āĻ…āĻĢ āĻ•āύāĻŸā§‡āĻ¨ā§āϟ āĻĨ⧇āϕ⧇ āĻĻ⧇āĻ–āĻŋ āĻāχ āϟāĻĒāĻŋāĻ• āĻ•āϤ āύāĻŽā§āĻŦāϰ āĻĒ⧇āĻœā§‡ āφāϛ⧇āĨ¤āϝāĻžāϤ⧇ āĻ•āϰ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āĻĒ⧁āϰ⧋ āĻŦāχ āϖ⧁āϜāϤ⧇ āύāĻž āĻšā§ŸāĨ¤ āĻĄā§‡āϟāĻžāĻŦ⧇āϜ āχāύāĻĄā§‡āĻ•ā§āϏāĻŋāĻ‚ āĻ“ āϤ⧇āĻŽāύāχ āĻāĻ•āϟāĻž āχāĻĢāĻŋāϏāĻŋā§Ÿā§‡āĻ¨ā§āϟ āĻŸā§‡āĻ•āύāĻŋāĻ•āĨ¤āĻĄā§‡āϟāĻžāĻŦ⧇āĻœā§‡ āϕ⧋āύ āĻĄā§‡āϟāĻžāϕ⧇ āĻĻā§āϰ⧁āϤ āϖ⧁āĻœā§‡ āĻŦ⧇āϰ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āχāύāĻĄā§‡āĻ•ā§āϏāĻŋāĻ‚ āĻ•āϰāĻž āϞāĻžāϗ⧇āĨ¤āϝāĻĻāĻŋ āĻāĻŽāύ āĻšā§Ÿ āĻāĻ•āϟāĻž āĻ•ā§ā§Ÿā§‡āϰāĻŋ āĻŦāĻžāϰ āĻŦāĻžāϰ āĻāĻ•ā§āϏāĻŋāĻ•āĻŋāωāϟ āĻ•āϰāϤ⧇ āĻšāĻšā§āϛ⧇ āĻāĻŦāĻ‚ āĻāĻ•āϟāĻž āĻ•āϞāĻžāĻŽ āĻĨ⧇āϕ⧇ āĻ­ā§āϝāĻžāϞ⧁ āĻŦāĻžāϰ āĻŦāĻžāϰ āϖ⧁āϜāϤ⧇ āĻšāĻšā§āϛ⧇ āϤāĻ–āύ āφāĻŽāϰāĻž āϏ⧇āχ āĻ•āϞāĻžāĻŽā§‡ āχāύāĻĄā§‡āĻ•ā§āϏāĻŋāĻ‚ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϕ⧋āύ āĻĄā§‡āϟāĻž āĻĻā§āϰ⧁āϤ āϰāĻŋāĻŸā§āϰāĻžāχāĻ­ āĻ•āϰāĻž āϝāĻžā§ŸāĨ¤āĻ•āĻŋāĻ¨ā§āϤ⧁ āχ...

Django select_related and prefetch_related

  Difference between select_related and prefetch_related Reducing SQL queries is one of the first steps when optimizing a Django project. There are two powerful methods included in the Django ORM to help us that can boost performance by creating a single more complex QuerySet rather than multiple, smaller queries. In this project we will understand about  select_related and prefetch_related.  Django use these two orm method to reduce sql queries in database based on different scenario.  select_related Lets assume  this two model we have.  class Author ( models . Model ): name = models . CharField ( max_length = 200 ) def __str__ ( self ): return self . name class Courses ( models . Model ): name = models . CharField ( max_length = 200 ) author = models . ForeignKey ( Author , on_delete = models . CASCADE , related_name = 'courses' ) def __str__ ( self ): return self . name Here we have two mode. ...