অ্যাবস্ট্রাক্ট ক্লাস হল – যেভাবে সাবক্লাস গুলো ডিজাইন করা হবে তার একটা নকশা বা ব্লু-প্রিন্ট। আমরা যদি টিমে কাজ করে থাকি তাহলে এরকম প্রয়োজন হতে পারে যে, একজন ডেভেলপার শুরুতে ঠিক করে দিবেন ক্লাস গুলোতে কি কি মেথড/প্রোপার্টি থাকবে। অন্য ডেভেলপার সে অনুযায়ী ক্লাস ডিজাইন করবেন। অর্থাৎ একজন নকশা করবেন, আরেকজন ইমপ্লিমেন্ট করবেন। এরকম পরিস্থিতির জন্য আছে অ্যাবস্ট্রাক্ট বেস ক্লাস।
আচ্ছা, এখন কল্পনা করি, আমি এবং আমার একজন বন্ধু মিলে একটা প্রোজেক্ট করছি। সেই প্রোজেক্টে একটা গাড়ির জন্য ক্লাস ডিজাইন করা লাগবে। সেই গাড়ির স্পিড – মেথড দিয়ে কমানো আর বাড়ানো যাবে। এই রিক্যুয়ারমেন্ট দেখেই আমি চিন্তা করে ফেললাম এমন একটা ক্লাস থাকবে, যার দুইটা মেথড থাকবে speed_up
আর speed_down
নামের। কিন্তু এ দুইটা মেথড কীভাবে ইমপ্লিমেন্ট করা হবে তা নিয়ে আমি আর চিন্তা করলাম না। এ কাজ আমার বন্ধুর উপর ছেড়ে দিলাম।
তাহলে আমি আমার বন্ধুকে নিচের মত একটা অ্যাবস্ট্রাক্ট ক্লাস তৈরি করে দিলাম।
|
|
এখানে লক্ষ্যনীয়, প্রথম লাইনে আমি abc
নামের একটা মডিউল ইমপোর্ট করেছি। এ মডিউলটা আমাদের অ্যাবস্ট্রাক্ট বেস ক্লাস ফিচারটা দেয়। এরপর 4 নম্বর লাইনের metaclass=abc.ABCMeta
দিয়ে পাইথনকে বলে দিচ্ছি, এটা অ্যাবস্ট্রাক্ট ক্লাস। মেটাক্লাস নিয়ে এখানে বিস্তারিত লিখবো না। পরে এ নিয়ে একটা ব্লগ লেখার ইচ্ছা আছে। এরপর 6 এবং 10 নম্বর লাইনে @abc.abstractmethod
ডেকরেটর দিয়ে বুঝিয়ে দিচ্ছি মেথড দুইটি অ্যাবস্ট্রাক্ট মেথড।
তাহলে আমি একরকম একটা কনট্রাক্ট লিখলাম। আর এ কনট্রাক্ট বাস্তবায়নের দায়িত্ব দিলাম আমার বন্ধুকে। কিন্তু আমার বন্ধু একটু হাবলু কিসিমের। সে প্রথমেই করলো কি, আমার দেয়া BaseCar
অ্যাবস্ট্রাক্ট ক্লাসটাকে ইন্সটেন্সশিয়েট করার চেষ্টা করলো।
|
|
কিন্তু অ্যাবস্ট্রাক্ট ক্লাসকে ইন্সটেন্সশিয়েট করা যায় না, শুধু ইনহেরিট বা সাবক্লাস করা যায়।
এ কথা জেনে ও এরপর এরকম কোড লিখলো:
|
|
এবার পাইথন ওকে এরকম ইরর দিল:
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
। অর্থাৎ সে কনট্রাক্ট ভায়োলেট করেছে। এটা করলে তো চলবে না। এখন সে ঠিক ঠাক করে এরকম কোড লিখলো:
|
|
এবার আর পাইথন বেঁকে বসেনি। অর্থাৎ সব ঠিক ঠাকই আছে।
এর মাধ্যমে আমরা পাইথনে অ্যাবস্ট্রাক্ট বেস ক্লাস সম্পর্কে ব্যাসিক একটা ধারণা পেলাম। বিস্তারিত জানতে চাইলে সার্চ ইঞ্জিন মামা তো আছেই। abc মডিউল সম্পর্কে বিস্তারিত জানা যাবে এখান থেকে।