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...

Django pk vs id

 Django pk VS id If you don’t specify primary_key=True for any fields in your model, Django will automatically add an IntegerField to hold the primary key, so you don’t need to set primary_key=True on any of your fields unless you want to override the default primary-key behavior. The primary key field is read-only. If you change the value of the primary key on an existing object and then save it, a new object will be created alongside the old one Example: class UserProfile ( models . Model ): name = models . CharField ( max_length = 500 ) email = models . EmailField ( primary_key = True ) def __str__ ( self ): return self . name suppose we have this model. In this model we have make email field as primary key. now django default primary key id field will be gone. It'll remove from database. we can not query as   UserProfile.objects.get(id=1) after make email as primary key this query will throw an error.  Now we have to use pk  Us...

Django Optimization Processes for Write Operation for Postgresql

When optimizing a Django project for large write operations, especially when dealing with PostgreSQL, there are several strategies you can employ to reduce the time it takes to perform these operations: 1. Bulk Inserts In django, we create objects using create()  . Asynchronous version is acreate() .It's a  convenience method for creating an object and saving it all in one step.  and  These are same and equivalent. The create() method is used to create and save a single object in the database. Example: Instead of inserting one row at a time, consider using Django's bulk_create() method to insert multiple rows in a single query. This reduces the overhead of multiple database round trips. Example:  The bulk_create() method is used to create and save multiple objects in the database in a single query. It accepts a list of model instances and inserts them into the database in a single batch operation, which significantly reduces the overhead compared to individ...