DEV Community

NK1FC
NK1FC

Posted on

OOPs In Python

  • It allows users to create objects with their own attributes.
  • Method act as a function that uses some parameter and objects itself or only the object itself to return some value or change the object. ### General format for creating a class

class NameOfClass:  #use camel casing to write the class name.

    def __init__(self, x, y):
        self.x=x
        self.y=y

    def some_method(self):
        pass    

Enter fullscreen mode Exit fullscreen mode

Why use oops?

  • It makes the development and management of projects more manageable.
  • Feature of data hiding.
  • Reusability of code

OOPs concepts

  • Class
  • Object
  • Encapsulation
  • Abstraction
  • Polymorphism
  • Inheritance
  • Constructor
  • Destructor

Class

  • A class is a blueprint that is used to create an object.
  • It creates an object having the same attribute and methods.
class NameOfClass:  #use camel casing to write the class name.

    def __init__(self, x, y):
        self.x=x
        self.y=y

    def some_method(self):
        pass    


Enter fullscreen mode Exit fullscreen mode

Object

  • It is an entity that has a predefined attributes and method.
class Dog:
    def __init__(self, name):
        self.name=name

    def bark(self):
        print(f'{self.name} woof')

newdog=Dog('tom')
newdog.bark() 
#output- It will print 'tom woof'
Enter fullscreen mode Exit fullscreen mode
  • All the objects created using class Dog the object will have an attribute name and a Method named bark().

Constructor

  • This will create object using the class.
  • init is used to create the object.
class Dog:
    def __init__(self, name):
        self.name=name


newdog=Dog('tom') # New object is constructed with attribute name tom.
Enter fullscreen mode Exit fullscreen mode

Destructor

  • It is used to delete the object.
  • It uses del Keyword.
class Dog:
    def __init__(self, name):
        self.name=name


newdog=Dog('tom') # New object is constructed with attribute name tom.
del newdog # the object new dog will be deleted.
Enter fullscreen mode Exit fullscreen mode

Encapsulation

  • Encapsulation allows us to hide the object's attributes and method from outside access.
  • Python doesn't have truly private or protected attributes and methods.
  • Attributes and methods that needed to be protected start with single underscore: _
  • Attributes and methods that needed to be private start with double underscore: __
class Person:

    def __init__(self, name, age):
        self.__name = name      # private attribute
        self._age = age         # protected attribute

    def get(self):         # This method is used to get the name that is private.
        return self.__name

    def set(self, name):   # This method will take some input names and change the value of the attribute.
        self.__name = name

    def get_age(self):          # This method is used to get the age that is protected.
        return self._age

    def set_age(self, age):     # This method will take some input age and change the value of the attribute.
        self._age = age

    def __show(self):           # private method
        return f"My name is {self.__name} and I am {self._age} years old."

    def _speak(self):           # protected method
        return f"My name is {self.__name}"

a=Person('Name',5)
print(a._Person__name) # accesing private variable it gives output Name
print(a._age) # acessing private variable it gives output age

a._Person__name='New Name' # change the private variable without using any method.
print(a.get_name())  # it return the name of object

Enter fullscreen mode Exit fullscreen mode

Inheritance

  • Inheritance allows us to create a new class(Child class or derived class) based on another class(Parent class or base class).
  • The child class inherits all the attributes and methods of the parent class.
  • In addition, the child class it's own unique attributes and methods.
  • There are several types of inheritance:
    • Single Inheritance: Child class is derived using only one class.
    • Multiple Inheritance: Child class is derived using more than one class.
    • Multilevel Inheritance: In this child, class is inherited from the child class of another parent class
    • Hierarchical Inheritance: Multiple child class is created using single parent class.
    • Hybrid Inheritance: Inheritance of multiple types takes place
class Person:

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def show(self):
        print(f'My name is {self.name}, and I am {self.age} years old.')

class NewPerson(Person):                        # inheriting parent class in child class

    def speak(self):                # accessing parent class attribute.
        print("I am new person")

class AnotherPerson(Person):                        # inheriting parent class in child class

    def __init__(self, name, age, sport):
        super().__init__(name, age)     # accessing parent class attribute in child class using super and changing the
        self.sport = sport              # child class attribute 

    def speak(self):
        print(f'My favorite sport is {self.sport}.')

D = AnotherPerson("Bruno", 9, 'Football')
C = NewPerson("Missa", 6)

D.show()                    # accessing parent class method in child class
#output- My name is Bruno, and I am 9 years old.
D.speak()                   # child class accessing its own attributes
#output- My favorite sport is Football. 
C.show()                    # accessing parent class method in child class
#output- My name is Missa, and I am 6 years old.                        
C.speak()                   # child class accessing its own attributes
#output- I am new Person            
Enter fullscreen mode Exit fullscreen mode

Abstraction

  • Abstraction allows us to hide classes and methods not necessary for the user.
  • An abstract class in python can be made by setting the parent class of any class to ABC after importing it from abc (Abstract Class Bases).
  • If you need to create an abstract method also import abstractmethod from abc module.
  • After that, we can create an abstract method using the @abstractmethod decorator.
from abc import ABC, abstractmethod

class Person(ABC):          # create an abstract class
    @abstractmethod     # create an abstract method
    def speak(self):
        pass

    def show(self):
        print("I am a Person.")

class AnotherPerson(Person):

    def speak(self):
        print("I am another person")


bruno = AnotherPerson()         
bruno.speak()           # ignoring abstract method of abstract class
#output- I am another person
bruno.show()            # non-abstract method of the abstract class still works
#output- I am a Person
person= Person() #this will throw an error abstract class can't be instantiated.        
Enter fullscreen mode Exit fullscreen mode

Polymorphism

  • It simply refers that different classes can have the same method name and it also represents method overriding.
  • Polymorphism in Python can be achieved in two ways: method overriding and duck-typing.

A. Method Over-riding

Method overriding allows a child class to have a different definition of a method already defined in the parent class.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def speak(self):
        print(f'My name is {self.name} and I am {self.age} years old.')

class NewPerson(Person):
    pass

class AnotherPerson(Person):

    def speak(self):                # over-riding method of parent's class
        print(f'Hello! My name is {self.name} and I am {self.age} years old.')

nemo = Person("Nemo", 2)
bruno = AnotherPerson("Bruno", 9)

nemo.speak()                        # parent's class method runs
#output- My name is Nemo and I am 2 years old.
bruno.speak()                       # child's class method runs
#output- Hello! My name is Bruno and I am 9 years old.
Enter fullscreen mode Exit fullscreen mode

B. Duck Typing

Duck Typing allows different types of classes to have the same method name with its own definition.

class Person:

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def speak(self):                # method of first class
        print(f'My name is {self.name} and I am {self.age} years old.')

class AnotherPerson:

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def speak(self):                # method of second class with same name
        print(f'Hello! My name is {self.name} and I am {self.age} years old')

nemo =Person("Nemo", 2)
bruno = Another("Bruno", 9)

nemo.speak()                        # method of first-class runs
# output- My name is Nemo and I am 2 years old.
bruno.speak()                       # method of the second class with the same name runs
#output- Hello! My name is Bruno and I am 9 years old.
Enter fullscreen mode Exit fullscreen mode

Dunder/Magic Methods:

  • Dunder or magic methods are special methods used in Python classes.
  • They are used to define how objects of classes behave in case they are used with in-built Python operations.
  • Some commonly used dunder methods are init,(self,...), str(self), len(self), etc.
  • Dunder methods cannot be called, they run automatically when called by in-built python functions.
class Book:
    def __init__(self,title,author,page):
        self.title=title
        self.author=author
        self.page=page

    def __str__(self):
        return f'This {self.title} wrote by {self.author}'

    def __len__(self):
        return self.page

kid_book=Book('New Book', 'Myself', 15)

print(kid_book)
#output- This Newbook wrote by Myself
print(len(kid_book))
#output- 15
Enter fullscreen mode Exit fullscreen mode

References

Top comments (0)