কম্পিউটার টিউটোরিয়াল

পাইথনে ক্লাস এবং অবজেক্ট: বেগাইনারদের জন্য

আজ আমরা ক্লাস নিয়ে কথা বলব। না, আমরা স্কুল ক্লাসের কথা বলছি না।

প্রোগ্রামিং-এ, ক্লাসের নিজস্ব ডেফিনিশন আছে। একটি ক্লাস হলো একটি কোডার দ্বারা তৈরি করা একটি অবজেক্টের জন্য ব্লুপ্রিন্ট। এটি ডিফাইন করে যে কোন ডেটা একটি অবজেক্টে সংরক্ষণ করা যাবে এবং সেই নির্দিষ্ট অবজেক্টের ওপর কী মেথডগুলো পারফর্ম করা যাবে।

পাইথন একটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ল্যাঙ্গুয়েজ। এর মানে এটি একটি ডেভেলপমেন্ট প্যাটার্ন ব্যবহার করে যেখানে অবজেক্ট এবং ক্লাস ব্যবহার করে ডেটা সংরক্ষণ করা হয়।

অবজেক্ট-ওরিয়েন্টেড পদ্ধতি আপনার কোডে রিপিটিশন কমাতে সাহায্য করে, যা আপনার কোডকে পড়তে এবং মেইনটেইন করা সহজ করে তোলে। ক্লাস এবং অবজেক্ট অনেক প্রোগ্রামিং ল্যাঙ্গুয়েজের অংশ, যেমন Java, Python, এবং C++।

এই গাইডে, আমরা ক্লাস কী, কীভাবে কাজ করে, এবং কীভাবে পাইথনে একটি ক্লাস ডিক্লেয়ার করা যায় তা আলোচনা করব। রাস্তে কয়েকটি উদাহরণ দিয়ে আপনাকে হেল্প করব।

ক্লাস কী?

একটি ক্লাস হলো একটি ব্লুপ্রিন্ট যা আপনি একটি অবজেক্ট ডিফাইন করতে ব্যবহার করেন।

কল্পনা করুন আপনি একটি বাড়ির ব্লুপ্রিন্ট দেখছেন। সেই ব্লুপ্রিন্টে আউटलাইন করা থাকবে দরোয়াজা কোথায় যাবে, জানালা কোথায় বসবে, ইত্যাদি। প্রোগ্রামিং-এ একটি ক্লাস একইরকম। একটি ক্লাস একটি অবজেক্টে কোন ডেটা সংরক্ষণ করা যাবে সেটির ওপর একটি ব্লুপ্রিন্ট প্রদান করে।

ক্লাস class কীওয়ার্ড ব্যবহার করে ডিফাইন করা হয়। চলুন Player নামে একটি ক্লাস ডিফাইন করে শুরু করি যাতে দুটি ফাংশন আছে:

class Player:

""" This is a class for a player """
name = "Luke"
def wield_sword(self):
    print("You have wielded your sword.")
def drink_health_potion(self):
    print("You have consumed a health potion.")

এই ক্লাসটি একটি ভিডিও গেমের প্লেয়ারকে রিপ্রেজেন্ট করে। এতে এট্রিবিউট এবং মেথড দুটোই আছে। এট্রিবিউটগুলোকে প্রায়শি ক্লাসের ভিতরে ইনস্ট্যান্স ভেরিয়েবল বলা হয়।

একটি মেথড আপনাকে তলোয়ার চালাতে দেয় আর অন্যটি হেলথ পশান পান করতে দেয়। ক্লাসে একটি ক্লাস ভেরিয়েবল আছে: name। এটি আমাদের প্লেয়ারের ডিফল্ট নাম সংরক্ষণ করে।

লক্ষ্য করুন যে আমরা আমাদের কোডে self শব্দটি কয়েকবার ব্যবহার করেছি। Self যেভাবে শোনায় সেভাবেই: ক্লাসটি নিজের রিপ্রেজেন্টেশন। Self একটি নির্দিষ্ট ক্লাসে সংরক্ষিত সকল ভ্যালু ধারণ করে, তাই আপনি আপনার মেথডগুলোর ভিতরে সেগুলো সব অ্যাক্সেস করতে পারেন।

যখন আমরা আমাদের কোড রান করি, কিছুই হয় না। কী হচ্ছে? মনে রাখুন আমরা কীভাবে বলেছিলাম যে ক্লাসটি একটি ব্লুপ্রিন্ট? সেটিই কারণ কিছু হচ্ছে না। আমাদের ব্লুপ্রিন্টের সাথে কিছু করতে হবে যাতে সেটি উপকারী হয়।

অবজেক্ট কী?

একটি অবজেক্ট হলো একটি ক্লাসের একক ইনস্ট্যান্স। এটি একটি ক্লাস দ্বারা তৈরি করা ব্লুপ্রিন্ট ব্যবহার করে ডিফাইন করা হয়।

চলুন আমাদের গেমে একটি নতুন প্লেয়ার, লুক, এর জন্য একটি অবজেক্ট তৈরি করি:

luke = Player()

আমরা ঠিক এখন একটি অবজেক্ট তৈরি করেছি যার নাম Luke। আমাদের অবজেক্টটি এখন আমাদের ক্লাসে সংরক্ষিত সকল ডেটা এবং আমাদের ক্লাসের সাথে জুড়ে থাকা মেথডগুলো অ্যাক্সেস করতে পারে:

luke = Player()
print(luke.name)
luke.wield_sword()

আমাদের কোড রিটার্ন করে:

Luke

You have wielded your sword.

আমাদের কোডে, আমরা আমাদের Luke অবজেক্টের name এট্রিবিউটের ভ্যালু প্রিন্ট করেছি। একটি ক্লাসের এট্রিবিউট অ্যাক্সেস করতে, আপনাকে ক্লাসের নাম বলতে হবে, তারপর একটি ডট, তারপর যে ইনস্ট্যান্স এট্রিবিউটটি আপনি অ্যাক্সেস করতে চান সেটি। এটাকে প্রায়শি ডট নোটেশন বলা হয়।

ডিফল্টরূপে, name এর ভ্যালু Luke সেট করা ছিল। এক মিনিটে আমরা কীভাবে এটি চেঞ্জ করব সেটা বলব।

আমরা আমাদের wield_sword() ক্লাসও কল করেছি। যখন আমরা এই ক্লাসটি কল করলাম, আমাদের Player ক্লাসের ভিতরে থাকা wield_sword() মেথডের কন্টেন্ট এক্সিকিউট হয়েছে। এতে কনসোলে একটি মেসেজ প্রিন্ট হয়েছে: "You have wielded your sword."

আপনি একটি ক্লাসের যত ইচ্ছা তত ইনস্ট্যান্স ডিক্লেয়ার করতে পারেন: তাই ক্লাসটি এত শক্তিশালী। আপনি একই মেথড এবং ডিফল্ট ভ্যালুগুলো যা একটি ক্লাসে সংরক্ষিত থাকে, একাধিক ভিন্ন অবজেক্টে রিয়ুজ করতে পারেন।

ক্লাস কনস্ট্রাক্টর

কনস্ট্রাক্টর আপনাকে একটি ক্লাসের ভিতরে ডেটা ইনিশিয়ালাইজ করতে দেয়। একটি কনস্ট্রাক্টর মেথড আপনি একটি ক্লাসের একটি অবজেক্ট ডিক্লেয়ার করার সাথে সাথে এক্সিকিউট হয়।

কনস্ট্রাক্টরের নাম __init__()। আপনি আপনার কোডে ডবল আন্ডারস্কোর (__) থাকা ফাংশন देखने অভ্যস্ত হতে পারেন। এই ফাংশনগুলোকে স্পেশাল ফাংশন বলা হয় কারণ এদের একটি প্রিডিফাইনড উদ্দেশ্য থাকে। এই কেসে, __init__-এর উদ্দেশ্য হলো আমাদের ক্লাস ইনিশিয়ালাইজ করা।

আগে তৈরি করা Player ক্লাসটি আপডেট করুন এই মেথডটি ক্লাসের টপে যোগ করে:

def __init__(self):
    print("Your character has been created.")

এই মেথডটি আপনার ক্লাসে যেকোনো ভেরিয়েবল বা মেথড ডিফাইন করার আগে এসে থাকতে হবে। চলুন আগের মেইন কোডটি আবার রান করি:

luke = Player()
print(luke.name)
luke.wield_sword()

আমাদের কোড রিটার্ন করে:

Your character has been created.

Luke

You have wielded your sword.

আমরা আমাদের মেইন প্রোগ্রামে __init__ মেথডটি কল করিনি কিন্তু এটা সবুজ রান করল। কারণ কনস্ট্রাক্টর আপনি একটি ক্লাসের একটি অবজেক্ট তৈরি করলে অটোমেটিক্যালি এক্সিকিউট হয়।

আগে, আমরা আমাদের ক্লাসের name ভেরিয়েবলের ভ্যালু Luke অ্যাসাইন করেছিলাম। যারা আমাদের প্লেয়ারকে Luke ডাকতে চায় সেটা কেবল উপকারী, কিন্তু যদি প্লেয়ারদের ভিন্ন নাম থাকে তবে এটি প্র্যাক্টিক্যাল নয়।

সেই কারণেই কনস্ট্রাক্টর কাজে আসে। চলুন একটি কনস্ট্রাক্টর তৈরি করি যা আমাদের প্লেয়ারকে একটি নাম অ্যাসাইন করতে দেবে:

class Player:
    def __init__(self, name):
        self.name = name

এই কোড আমাদের প্রতিটি Player অবজেক্টে একটি প্যারামিটার পাস করতে দেয়। এই প্যারামিটারটি প্লেয়ারের নামকে রিপ্রেজেন্ট করবে। আমরা তারপর একটি মেথড তৈরি করব যা আমাদের প্লেয়ারের নাম বলে দেবে:

class Player:
    def __init__(self, name):
        self.name = name
    def get_name(self):
        print("Your name is " + self.name)

চলুন লिआহ নামের একটি প্লেয়ারের জন্য আমাদের Player ক্লাসের একটি নতুন ইনস্ট্যান্স তৈরি করি:

leah = Player("Leah")
leah.get_name()

আমাদের কোড রিটার্ন করে:

Your name is Leah.

আমরা আমাদের অবজেক্টের name ভেরিয়েবলের ভ্যালু Leah অ্যাসাইন করেছি। এর মানে আমাদের ক্লাসে যেকোনো জায়গা এটিকে রেফার করলে, এর ভ্যালু Leah। কনস্ট্রাক্টর আমাদের ক্লাসের একটি অবজেক্ট তৈরি করার সাথে সাথে এক্সিকিউট হয়, তাই আমাদের এটিকে কল করার চিন্তা করতে হয় না।

তারপর আমরা get_name() মেথডটি কল করি যা আমাদের প্লেয়ারের সাথে জুড়ে থাকা নাম প্রিন্ট করে।

আপনি একটি ক্লাসে যত ইচ্ছা তত প্যারামিটার যোগ করতে পারেন:

class Player:
    def __init__(self, name, player_type):
        self.name = name
        self.player_type = player_type
    def get_name(self):
        print("Your name is " + self.name)
    def get_player_type(self):
        print(self.name + " is a " + self.player_type + ".")

এই উদাহরণে, আমাদের Player ক্লাস দুটি প্যারামিটার সাপোর্ট করে। একটি প্লেয়ারের নামকে রিপ্রেজেন্ট করে (name) এবং অন্যটি সেই প্লেয়ারের টাইপকে (player_type)। চলুন এই ক্লাসের একটি অবজেক্ট তৈরি করি:

leah = Player("Leah", "Mage")
leah.get_name()
leah.get_player_type()

আমাদের কোড রিটার্ন করে:

Your name is Leah.

Leah is a Mage.

আমরা য دوটি ইনিশিয়াল ভ্যালু স্পেসিফাই করেছিলাম, সেগুলো আমাদের ক্লাসে অ্যাক্সেসযোগ্য।

উপসংহার

ক্লাস আপনাকে আপনার কোডে রিপিটিশন কমাতে সাহায্য করে। একবার আপনি একটি ক্লাস ডিফাইন করলে, আপনি তার স্ট্রাকচার ব্যবহার করে যত ইচ্ছা তত অবজেক্ট ডিফাইন করতে পারেন। কম রিপিটিশনের ফলে, আপনার কোড পড়তে সহজ হয়, এবং তাই মেইনটেইন করাও সহজ।

এখন আপনি পাইথন ক্লাস লিখতে এক্সপার্টের মতো রেডি!

  1. পাইথনে ফাইল অবজেক্ট: ফাইল পড়া, লিখা এবং ম্যানেজমেন্টের সম্পূর্ণ গাইড

  2. পাইথনে ক্লাস এবং ইনহেরিটেন্সের পরিচিতি

  3. পাইথনে ক্লাস কীভাবে ডিফাইন করবেন?

  4. পাইথন এবং Boto3 দিয়ে সহজে S3 অবজেক্ট রিট্রিভ করুন: ধাপে ধাপে গাইড