পাইথনে অ্যাবস্ট্রাক্ট বেস ক্লাস

অ্যাবস্ট্রাক্ট ক্লাস হল – যেভাবে সাবক্লাস গুলো ডিজাইন করা হবে তার একটা নকশা বা ব্লু-প্রিন্ট। আমরা যদি টিমে কাজ করে থাকি তাহলে এরকম প্রয়োজন হতে পারে যে, একজন ডেভেলপার শুরুতে ঠিক করে দিবেন ক্লাস গুলোতে কি কি মেথড/প্রোপার্টি থাকবে। অন্য ডেভেলপার সে অনুযায়ী ক্লাস ডিজাইন করবেন। অর্থাৎ একজন নকশা করবেন, আরেকজন ইমপ্লিমেন্ট করবেন। এরকম পরিস্থিতির জন্য আছে অ্যাবস্ট্রাক্ট বেস ক্লাস।

আচ্ছা, এখন কল্পনা করি, আমি এবং আমার একজন বন্ধু মিলে একটা প্রোজেক্ট করছি। সেই প্রোজেক্টে একটা গাড়ির জন্য ক্লাস ডিজাইন করা লাগবে। সেই গাড়ির স্পিড – মেথড দিয়ে কমানো আর বাড়ানো যাবে। এই রিক্যুয়ারমেন্ট দেখেই আমি চিন্তা করে ফেললাম এমন একটা ক্লাস থাকবে, যার দুইটা মেথড থাকবে speed_up আর speed_down নামের। কিন্তু এ দুইটা মেথড কীভাবে ইমপ্লিমেন্ট করা হবে তা নিয়ে আমি আর চিন্তা করলাম না। এ কাজ আমার বন্ধুর উপর ছেড়ে দিলাম।

তাহলে আমি আমার বন্ধুকে নিচের মত একটা অ্যাবস্ট্রাক্ট  ক্লাস তৈরি করে দিলাম।

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import abc


class BaseCar(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def speed_up(self):
        pass

    @abc.abstractmethod
    def speed_down(self):
        pass

এখানে লক্ষ্যনীয়, প্রথম লাইনে আমি abc নামের একটা মডিউল ইমপোর্ট করেছি। এ মডিউলটা আমাদের অ্যাবস্ট্রাক্ট বেস ক্লাস ফিচারটা দেয়। এরপর 4 নম্বর লাইনের metaclass=abc.ABCMeta দিয়ে পাইথনকে বলে দিচ্ছি, এটা অ্যাবস্ট্রাক্ট ক্লাস। মেটাক্লাস নিয়ে এখানে বিস্তারিত লিখবো না। পরে এ নিয়ে একটা ব্লগ লেখার ইচ্ছা আছে। এরপর 6 এবং 10 নম্বর লাইনে @abc.abstractmethod ডেকরেটর দিয়ে বুঝিয়ে দিচ্ছি মেথড দুইটি অ্যাবস্ট্রাক্ট মেথড।

তাহলে আমি একরকম একটা কনট্রাক্ট লিখলাম। আর এ কনট্রাক্ট বাস্তবায়নের দায়িত্ব দিলাম আমার বন্ধুকে। কিন্তু আমার বন্ধু একটু হাবলু কিসিমের। সে প্রথমেই করলো কি, আমার দেয়া BaseCar অ্যাবস্ট্রাক্ট ক্লাসটাকে ইন্সটেন্সশিয়েট করার চেষ্টা করলো।

15
toyota = BaseCar()

কিন্তু অ্যাবস্ট্রাক্ট ক্লাসকে ইন্সটেন্সশিয়েট করা যায় না, শুধু ইনহেরিট বা সাবক্লাস করা যায়।

এ কথা জেনে ও এরপর এরকম কোড লিখলো:

15
16
17
18
19
20
21
22
23
24
25
26
27
class Car(BaseCar):

    def __init__(self, initial_speed):
        self.speed = initial_speed

    def speed_plus(self):
        self.speed += 5

    def speed_minus(self):
        self.speed -= 5


toyota = Car(50)

এবার পাইথন ওকে এরকম ইরর দিল:

Traceback (most recent call last):
  File "abstract.py", line 27, in <module>
    toyota = Car(50)
TypeError: Can't instantiate abstract class Car with abstract methods speed_down, speed_up

আসলে কনট্রাক্টে(অ্যাবস্ট্রাক্ট ক্লাসে) আমি বলে দিয়েছিলাম যে speed_up আর speed_down নামের দুটি মেথড থাকবে। কিন্তু আমার বন্ধু মেথড দুটির নাম দিয়েছে speed_plus আর speed_minus । অর্থাৎ সে কনট্রাক্ট ভায়োলেট করেছে। এটা করলে তো চলবে না। এখন সে ঠিক ঠাক করে এরকম কোড লিখলো:

15
16
17
18
19
20
21
22
23
24
25
26
27
class Car(BaseCar):

    def __init__(self, initial_speed):
        self.speed = initial_speed

    def speed_up(self):
        self.speed += 5

    def speed_down(self):
        self.speed -= 5


toyota = Car(50)

এবার আর পাইথন বেঁকে বসেনি। অর্থাৎ সব ঠিক ঠাকই আছে।

এর মাধ্যমে আমরা পাইথনে অ্যাবস্ট্রাক্ট বেস ক্লাস সম্পর্কে ব্যাসিক একটা ধারণা পেলাম। বিস্তারিত জানতে চাইলে সার্চ ইঞ্জিন মামা তো আছেই। abc মডিউল সম্পর্কে বিস্তারিত জানা যাবে এখান থেকে

Load Comments?