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

Django: Request/Response Cycle

Django Request Life Cycle  A web application or a website revolves around the request-response cycle and Django applications are no exception to this. But it is not just a two step process. Our Django applications needs to go through various stages to return the end user some result. To understand the Django framework better we must understand how the requests are initiated and the end result is served to the end user. When setting up a new Django project, one of the first things you’ll do is wire up your URLconfs and set up some views. But what’s actually happening under the hood here? How does Django route traffic to the view, and what part do middlewares play in this cycle? Layers of Django Application Request Middlewares URL Router(URL Dispatcher) Views Context Processors Template Renderers Response Middlewares Whenever a request comes in first it goes to the web server (Ngnix /Apache) . The the request goes to django's WSGI (Web Server Gateway Interface) / ASGI  (Asynchr...