Classification of Methods

এই টিউটোরিয়ালে আমরা OOP Method নিয়ে বিস্তারিত জানবো। আগের টিউটোরিয়ালে আমরা ক্লাস নিয়ে বিস্তারিত আলোচনা করেছি। তবে Method নিয়ে জানার আগে Class এর আরেকটি উদাহরণ দেখে নিই

Example - 1

class Dog:

    def init(self,name,color,age):

    self.name = name

    self.color = color

    self.age = age

    def bark(self):

        return f '{self.name} is barking'

    def changeName(self,name):

        self.name = name

        return 'Success'

    def changeColor(self,color):

        self.color = color

        return 'Success'

    def showDetail(self):

        return f 'Name:{self.name}\n
    Color:{self.color}\n

    Age:{self.age}'

    dog_1 = Dog(name = 'Jack',color = 'White',age = 5)

    print(dog_1.showDetail())

#Output:

Name:Jack

Color:White

Age:5

dog_1.changeName(‘Tommy’)

print(dog_1.showDetail())


#Output:

Name:Tommy

Color:White

Age:5

উপরের ক্লাসে আমরা Dog ক্লাস ডিজাইন করেছি যা Dog অবজেক্ট তৈরী করবে। ক্লাসের অধীনে যতগুলো ফাঙ্কশন নিয়েছি সেগুলোকে OOP তে মেথড বলে। আর আমরা যদি কোন অবজেক্ট এর প্রোপার্টি , মেথড এক্সেস নিতে চাই বা কোন Modification করতে চাই তাহলে আমাদেরকে সেই অবজেক্ট এর রেফারেন্সে এইসব কাজ করতে হবে। অবজেক্ট এর রেফারেন্স হচ্ছে self । প্রতিটি অবজেক্ট মেমোরিতে যে লোকেশনে স্টোর হয় সে লোকেশন এর ভ্যালু self এর মধ্যে assign করা থাকে। অর্থাৎ অবজেক্ট মেথড এর প্রথম প্যারামিটার হিসেবে self (অবজেক্ট এর রেফারেন্স ) থাকবে । তবে আমরা চাইলে self এর পরিবর্তে যে কোনকিছু দিতে পারি। কিন্তু প্রথম প্যারামিটার হিসেবে যাই দিই না কেন সেটি self বা অবজেক্ট এর রেফারেন্স হিসেবে কাউন্ট হবে।

এখন মেথড নিয়ে আলোচনা করি :

PoP অর্থাৎ Procedural Oriented Programming এ আমরা যাকে ফাঙ্কশন বলতাম সেই ব্যক্তিই OOP তে এসে তার পরিচয় পরিবর্তন করে মেথড হয়ে গেছে। তবে PoP তে ফাঙ্কশন প্রোগ্রামের যেকোন জায়গা থেকে এক্সেস করা গেলেও মেথড প্রোগ্রামের যেকোন জায়গা থেকে এক্সেস করা যায় না। এটি ক্লাসের ভেতর , অবজেক্ট এর রেফারেন্সে এক্সেস করতে হয়। অর্থাৎ এটি হচ্ছে লোকাল ফাঙ্কশন। মেথডের কয়েকটি প্রকার আছে

মেথডের প্রকারভেদ :

  1. Class Method

  2. Object Method / Instance Method (Object = Instance)

  3. Static Method

  4. Special Method / Dunder Method

Class Method

Class method ক্লাসের উপরে কাজ করে। অর্থাৎ ক্লাসের মধ্যে যদি কোন modification বা ক্লাস এর কোন প্রোপার্টি এক্সেস করতে হয় তাহলে class method ইউজ করা হয়। class method ডিফাইন করতে হলে @classmethod ডেকোরেটর ব্যাবহার করতে হয়। Classmethod এর প্রথম প্যারামিটার হিসেবে cls থাকবে। এবং ক্লাস এর কোনো প্রোপার্টি সব অব্জেক্টই পেয়ে থাকে।

Decorator নিজেই একটা ফাঙ্কশন যা অন্য ফাঙ্কশন এর কার্যক্ষমতা বৃদ্ধি করে। ডেকোরেটর ডিফাইন করতে হলে আগে (@) symbol দিয়ে ডেকোরেটর ফাঙ্কশন এর নাম লেখা লাগে। ডেকোরেটর ডিফাইন করা হলে অবশ্যই তার নিচে ক্লাস কিংবা অন্য কোন ফাঙ্কশন ডিফাইন করা লাগে। (যে ফাঙ্কশন এর উপর ডেকোরেটর ডিফাইন করা হয়েছে সে ফাঙ্কশন এর কার্যক্ষমতা বৃদ্ধি পাবে )। এখন ডেকোরেটর নিয়ে চিন্তা করতে করতে মাথার চুল ফেলে দেয়ার দরকার নেই 😅। শুধুমাত্র ষ্টার এর মধ্যে লেখা লাইনটি মাথায় রাখলে এনাফ।

Example - 1)

একটি শিক্ষা প্রতিষ্ঠানের সব স্টুডেন্টদের কিন্তু একটা কমন প্রোপার্টি আছে। সেই প্রোপার্টি হচ্ছে তাদের তাদের প্রতিষ্ঠানের নাম। তাই সেটি কিন্তু আলাদা করে ইনপুট নেয়ার দরকার নাই। শুধুমাত্র স্টুডেন্টসদের নাম , রোল , শাখা ইত্যাদি ইনপুট নিলেই যথেষ্ট। তাই আমরা প্রতিষ্ঠানের নাম init মেথড এর মধ্যে প্যারামিটার হিসেবে রাখবো না। এটিকে সরাসরি ক্লাসের অধীনে রাখবো। ক্লাসের অধীনে যা রাখা হয় সেটি ক্লাসের মধ্যে বা অবজেক্ট এর মধ্যে যেকোন জায়গা থেকে এক্সেস করা যায় এবং সেম থাকে। কোড লিখে বুঝা যাক

class Student:
    clg_name = 'DPI'

    def init(self,name,roll,group,dept):

        self.name = name

        self.roll = roll

        self.group = group

        self.dept = dept    

    def stdInfo(self):

        returnf'Name:{self.name}\nRoll:{self.roll}\nGroup:{self.group}\nDepartment:{self.dept}\nCollege:{cls.clg_name}\nCollege:{self.clg_name}'




    def changeName(self,name):

        self.name = name


    @classmethod

    def changeClgName(cls,clg_name):

        cls.clg_name = clg_name


    @staticmethod 

    def checkDept(roll):
        len_roll = str(roll)
        if len_roll > 6 or len_roll < 6:
            return 'Invalid roll'

        else:
            code = len_roll[:2]

        if len(code) > 2 or len(code) <2:
                return 'Invalid code'

        elif code == '85':
            return 'CST'

        elif code == '63':

            return 'Chemical'

        elif code == '61':

            return 'Arch'

        elif code == '62':

            return 'Automobile'

        else:

            return 'Invalid code'

std_1 = Student(name = 'Nishan',Roll = 01256 , Group = 'X' , dept = 'CST')

print(std_1.stdInfo())


#Output

Name:Nishan

Roll:853756

Group:A

Dept:CST

Clg:DPI

উপরের ক্লাসে যে মেথডের আগে @classmethod লেখা হয়েছে সেটিই class method। class method ক্লাসকে মোডিফাই করে। এখানে আমরা চাচ্ছি clg_name variable এ assign করা value DPI কে মোডিফাই করে Dhaka Polytechnic Institute করবো। তাহলে আমাদেরকে উপরে যেভাবে class method ডিফাইন করা হয়েছে সেভাবে করতে হবে। class method এর প্রথম প্যারামিটার হিসেবে cls হবে।

Syntax of class method:

def method_name(cls,extra_parameter):

    cls.variable_name =  extra_parameter

এখন আমরা এই মেথড ইউজ করে দেখি।

Student.changeClgName(‘Dhaka Polytechnic Institute’)
print(std_1.stdInfo())

#Output
Name:Nishan

Roll:853756

Group:A

Dept:CST

Clg:Dhaka Polytechnic Institute

দেখা যাচ্ছে আমাদের কলেজের নামটি চেঞ্জ হয়ে গিয়েছে। আমরা ১টি অবজেক্ট তৈরী করে দেখলাম। এর আগে যদি আরো ১০০টি অবজেক্ট ও তৈরী করা থাকতো তাহলে সেখানেও পরিবর্তন আসতো।

**যেহেতু ক্লাসমেথড কোন অবজেক্ট এর রেফেরেন্স কাজ করে না তাই আমরা সরাসরি class এর মাধ্যমে এটিকে এক্সেস করেছি।

Syntax:

Student.class_name(**argument)

Object Method / Instance Method

class method যেমন ক্লাসের উপরে কাজ করে ঠিক তেমনই অবজেক্ট মেথড অবজেক্টের উপরে কাজ করে। তবে পার্টিকুলার অবজেক্ট অবশ্যই। যেহেতু পার্টিকুলার অবজেক্ট এর উপরে কাজ করে তাই আমাদেরকে সেই অবজেক্ট এর রেফারেন্স দিয়ে দিতে হবে। রেফারেন্স বলতে বোঝাচ্ছি সেই অবজেক্ট এর মেমরি লোকেশন। অর্থাৎ অবজেক্ট টি মেমোরিতে কোথায় স্টোর হয়ে আছে সেই লোকেশন। আর সেই রেফারেন্সটি হচ্ছে self । মেথড এর প্রথম প্যারামিটার হিসেবে self থাকবে সবসময়। উপরে ডিফাইন করা Class এ init এবং class method , checkDept (static method) বাদে বাকি সবগুলো মেথডই হচ্ছে অবজেক্ট মেথড।

std_2 = Student(name = 'Razoan Abir' , roll = 123456 , group = 'Y' , dept = 'CST')
print(std_2.stdInfo())

#Output
Name:Razoan Abir

Roll:853756

Group:A

Dept:CST

Clg:Dhaka Polytechnic Institute

std_2.changeName('Razoan Abir Lizan')

print(std_2.stdInfo())

#Output


Name:Razoan Abir Lizan

Roll:853756

Group:A

Dept:CST

Clg:Dhaka Polytechnic Institute

এখানে আমরা std_2 অবজেক্ট তৈরী করেছি এবং changeName() মেথড দিয়ে std_2 এর নাম চেঞ্জ করতে পেরেছি। যদি আমরা আগের অবজেক্ট এর ইনফো প্রিন্ট করে দেখি তাহলে দেখতে পারবো সেই অবজেক্ট এর নাম পরিবর্তন হয়নি। কারণ আমরা অবজেক্ট মেথড ব্যাবহার করে std_2 এর নাম পরিবর্তন করেছি। যেহেতু অবজেক্ট মেথড শুধুমাত্র পার্টিকুলার অবজেক্ট এর উপর কাজ করে তাই শুধুমাত্র std_2 এর নাম পরিবর্তন হয়েছে।

Static Method

static method অবজেক্ট কিংবা ক্লাসের উপর কাজ করে না। এটি ইউজার থেকে ইনপুট নেয় এবং প্রোগ্রামে যেভাবে ইন্সট্রাকশন দেয়া থাকে সেভাবে কাজ করে আউটপুট রিটার্ন করে। স্ট্যাটিক মেথড ডিফাইন করার আগে @staticmethod ডেকোরেটর ইউজ করতে হয়। স্ট্যাটিক মেথড এর জন্য self কিংবা cls এর মতো স্পেশাল কোন প্যারামিটার থাকে না।

উপরের ক্লাসে আমরা checkDept() নামে একটি স্ট্যাটিক মেথড ডিফাইন করেছি যা ইউজার থেকে কোড ইনপুট নিয়ে বলবে কোন ডিপার্টমেন্ট এর কোড এটি।

Example:

print(Student.checkDept(853756))

#Output
CST
0
Subscribe to my newsletter

Read articles from Ata Alahy Nishan directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Ata Alahy Nishan
Ata Alahy Nishan