# ক্লাস

&#x20;এই চ্যাপ্টারটি সর্বশেষ হালনাগাদ হয়েছেঃ সময়ে

খুব সহজ ভাবে বলতে গেলে ক্লাস হচ্ছে এক ধরনের **টেম্পলেট বা ব্লুপ্রিন্ট** যার উপর ভিত্তি করে অনেক গুলো আলাদা আলাদা অবজেক্ট তৈরি করা সম্ভব। উদাহরণ সরূপ, যদি কখনো এমন প্রয়োজন হয় যে, একটি গেম ডেভেলপ করা দরকার এবং সেটায় বেশ কিছু দৈত্য, দানব থাকবে এবং সেগুলোকে একটা নায়ক চরিত্র ধ্বংস করে গেম ওভার করবে।\
এরকম একটা গেম ডিজাইনে অবজেক্ট ওরিয়েন্টেড কনসেপ্ট খুবি উপকারী হতে পারে। যেমন, প্রথমেই সাধারণ একটা দৈত্য কেমন হয় তার উপর ভিত্তি করে একটা টেম্পলেট বা ব্লুপ্রিন্ট বানানো যেতে পারে। এরপর, গেমের প্রয়োজনে যতগুলো ভিন্ন ভিন্ন দৈত্য চরিত্র দরকার পরবে আমরা সেই টেম্পলেট ব্যবহার করে এবং দরকার হলে টুকটাক পরিবর্তন করে তত গুলো ভিন্ন ভিন্ন দৈত্য চরিত্র তৈরি করে নিতে পারবো।\
মজার ব্যাপার হচ্ছে আমাদের তৈরি করা দৈত্য গুলোর কম্পিউটার মেমোরিতে আলাদা আলাদা অস্তিত্ব থাকবে। অর্থাৎ সেগুলো স্বাধীন এক একটা দৈত্য যাদের সবার মধ্যে মুল জিনিষ গুলোতে মিল আছে (যেহেতু একই টেম্পলেট থেকে তৈরি করা) এবং আলাদা আলাদা কিছু বৈশিষ্ট্য এবং আচরণও আছে।

> এই যে একটা দৈত্য বানানোর টেম্পলেট যেখান থেকে অনেক গুলো দৈত্য চরিত্র তৈরি করা যায়, সেটাকে বলা হয় ক্লাস। আর সেই ক্লাস ব্যবহার করে তৈরি করা আলাদা আলাদা দৈত্য চরিত্র গুলোকে বলা হয় অবজেক্ট।

`class` কিওয়ার্ড ব্যবহার করে পাইথনে ক্লাস তৈরি করা হয়, একটি ক্লাসের মধ্যে বিভিন্ন মেথড(ফাংশন) এবং অ্যাট্রিবিউট (প্রপার্টি) থাকতে পারে যেগুলো পাইথনের নিয়ম অনুযায়ী ইন্ডেন্টেড ব্লকের মধ্যে থাকে।

উদাহরণ,

```python
# The blueprint to create monsters
class Monster:
    def __init__(self, color, heads):
        self.color = color
        self.heads = heads

# Create some real monsters
fogthing = Monster("Black", 5)
mournsnake = Monster("Yellow", 4)
tangleface = Monster("Red", 3)

# Check whether those monsters got different existence in memory or not
print('I have ' + str(fogthing.heads) + ' heads and I\'m ' + fogthing.color)
print('I also have ' + str(mournsnake.heads) + ' heads and I\'m ' + mournsnake.color)
print('I got ' + str(tangleface.heads) + ' heads and I\'m ' + tangleface.color)
```

আউটপুট,

```python
I have 5 heads and I'm Black
I also have 4 heads and I'm Yellow
I got 3 heads and I'm Red
```

উপরে প্রথমেই একটি ক্লাস (আমাদের ভাষায় ব্লুএপ্রিন্ট বা টেম্পলেট) তৈরি করা হয়েছে। এর মধ্যে একটি ম্যাজিক মেথড আছে `__init__` (যেটা নিয়ে নিচে আলোচনা আছে) এবং এর দুটো অ্যাট্রিবিউট আছে `color` ও `heads` এবং এই ক্লাসকে ব্যবহার করে বা ইন্সট্যান্টশিয়েট করে ৩টি অবজেক্ট তৈরি করা হয়েছে যেগুলো কিনা নিজেরা আলাদা আলাদা।

`__init__` **মেথড**

এই মেথডটি যেকোনো ক্লাসের খুবি গুরুত্বপূর্ণ একটি মেথড। যখনি কোন ক্লাস থেকে কোন অবজেক্ট বা ইন্সট্যান্স তৈরি করা হয় তখনি এই মেথডটি স্বয়ংক্রিয় ভাবে কল হয়। ক্লাসের মেথডের ক্ষেত্রে আরেকটি গুরুত্বপূর্ণ বিষয় হচ্ছে - সব মেথডের প্রথম প্যারামিটারটি হতে হয় `self`. যদিও এই মেথড গুলোকে কল করার সময় নির্দিষ্ট করে এই আর্গুমেন্টটি পাঠাতে হয় না (পাইথন নিজে থেকেই এটা ম্যানেজ করে)।

বস্তুত এই `self`, ওই মেথডকে কল করা ইন্সট্যান্সটিকেই নির্দেশ করে। অর্থাৎ, উপরের উদাহরণ অনুযায়ী যখন `fogthing = Monster("Black", 5)` লিখে `fogthing` নামের একটি অবজেক্ট তৈরি করা হচ্ছে। তখন কিন্তু `__init__` কল হচ্ছে স্বয়ংক্রিয় ভাবে। আর এই `__init__` মেথডের কাছে প্রথম আর্গুমেন্ট `self` হিসেবে চলে যাচ্ছে এই `fogthing` ইন্সট্যান্সটি। আর ওই মেথডের ডেফিনেশনের মধ্যে সেই `self` এর দুটো অ্যাট্রিবিউট `color` এবং `heads` কে সেট করা হচ্ছে (এর কাছে আসা দ্বিতীয় ও তৃতীয় আর্গুমেন্ট এর ভ্যালু নিয়ে)। তাহলে পক্ষান্তরে কিন্তু `fogthing` অবজেক্ট এর দুটো অ্যাট্রিবিউট সেট হয়ে গেলো অবজেক্ট তৈরির সাথে সাথেই।

আর সাধারণ ভাবেই,

```python
print('I have ' + str(fogthing.heads) + ' heads and I\'m ' + fogthing.color)
```

স্টেটমেন্টের মাধ্যমে `fogthing.heads` সিনট্যাক্স ব্যবহার করে এর অ্যাট্রিবিউটকে অ্যাক্সেস করা হচ্ছে।

> dot চিহ্ন ব্যবহার করে একটি অবজেক্টের অ্যাট্রিবিউট এবং মেথড গুলোকে অ্যাক্সেস করা হয়। `__init__` মেথড কে কন্সট্রাক্টর বলা হয়

**ক্লাসের অন্যান্য মেথড**

আগেই বলা হয়েছে ক্লাস হচ্ছে এক ধরনের ব্লুপ্রিন্ট যাকে ব্যবহার করে বিভিন্ন অবজেক্ট বা ইন্সট্যান্স তৈরি করা যায়। এখন, বাস্তবে একটি অবজেক্ট (উদাহরণ অনুযায়ী দৈত্য চরিত্র গুলো) এর যেমন কিছু বৈশিষ্ট্য (অ্যাট্রিবিউট - color, heads) থাকে, তেমনি কিছু কার্যকলাপ বা সক্রিয়তা থাকে। তো, ক্লাস তথা ব্লুপ্রিন্টের মধ্যে সেগুলোকে মেথড হিসেবে ডিফাইন করা হয়।

উদাহরণ,

```python
class Monster:
    def __init__(self, color, heads):
        self.color = color
        self.heads = heads

    def attack(self):
        print("Just attacked a Hero, Mu...hahahaha!!!")

# Create an instance/object/monster-character
mournsnake = Monster("Yellow", 4)
# Check if its created or not
print('I am a ' + str(mournsnake.heads) + ' headed monster.')
# Make an attack by the new monster
mournsnake.attack()
```

আউটপুট,

```python
I am a 4 headed monster.
Just attacked a Hero, Mu...hahahaha!!!
```

উপরের উদাহরণে, `Monster` ক্লাসের মধ্যে একটি কাস্টম মেথড ডিফাইন করা হয়েছে `attack` নামে। অর্থাৎ সাধারণ ভাবে যেকোনো দৈত্যর আক্রমণ করার ক্ষমতা থাকতেই পারে। আর এই ক্লাস থেকে যখন কোন ইন্সট্যান্স তৈরি করা হবে তখন সেই ইন্সট্যান্স তথা অবজেক্টেরও আক্রমণ করার ক্ষমতা থাকবে। অর্থাৎ, `attack` মেথডটিকে সেই অবজেক্টও ব্যবহার করতে পারবে।

**ক্লাস অ্যাট্রিবিউট**

একটি ক্লাসের মধ্যে সাধারণ কিছু বৈশিষ্ট্য ডিফাইন করা যায় যেগুলো একটু অন্য রকম অর্থাৎ নির্দিষ্ট কোন অবজেক্টের বাধ্যগত না। যেমন, `__init__` মেথডের সাহায্য নিয়ে, এর মধ্যেকার `self` কে কাজে লাগিয়ে আমরা একটি ক্লাস থেকে তৈরি করা অবজেক্টের কিছু অ্যাট্রিবিউট সেট করতে পারি যেগুলো ওই অবজেক্টের অ্যাট্রিবিউট।\
কিন্তু, একটি ক্লাসের এমন কিছু অ্যাট্রিবিউট থাকতে পারে যেগুলো এর সব অবজেক্টই অ্যাক্সেস করতে পারবে তথা সব অব্জেক্টেরই অ্যাট্রিবিউট বলা যেতে পারে। এদেরকে ক্লাস অ্যাট্রিবিউট বলা হয়।

উদাহরণ,

```python
class Monster:
    identity = "negative character"

    def __init__(self, color, heads):
        self.color = color
        self.heads = heads

    def attack(self):
        print("Just attacked a Hero, Mu...hahahaha!!!")


mournsnake = Monster("Yellow", 4)
tangleface = Monster("Red", 3)

print('I am a ' + str(mournsnake.heads) + ' headed ' + mournsnake.identity)
print('I am a ' + str(tangleface.heads) + ' headed ' + tangleface.identity)
```

আউটপুট,

```python
I am a 4 headed negative character
I am a 3 headed negative character
```

উপরের উদাহরণে, `Monster` ক্লাসের একটি `ক্লাস অ্যাট্রিবিউট` আছে যার নাম `identity` এবং এটা এই ক্লাসের সব অবজেক্টের জন্যই এক এবং সব অবজেক্টই অ্যাক্সেস করতে পারে।\
আবার, যেহেতু এটা একটা ক্লাস অ্যাট্রিবিউট তাই একে ক্লাসের নাম দিয়েও অ্যাক্সেস করা যায় নিচের মত করে,\
`print(Monster.identity)` যার আউটপুট আসবে, `negative character`

**রিভিউ**

> ক্লাস হচ্ছে ব্লুপ্রিন্ট যার উপর ভিত্তি করে মেমোরিতে ওই টাইপের কিছু অবজেক্ট তৈরি করা যায়। `class` কিওয়ার্ড ব্যবহার করে ক্লাস তৈরি করা হয়। ক্লাসের কিছু নিজস্ব অ্যাট্রিবিউট থাকে যাদেরকে ক্লাস অ্যাট্রিবিউট বলে। এদেরকে ক্লাস অথবা ইন্সট্যান্স দিয়ে অ্যাক্সেস করা যায়। এছাড়া ক্লাসের কিছু ইন্সট্যান্স অ্যাট্রিবিউট থাকতে পারে যেগুলোকে ইন্সট্যান্স এর অ্যাট্রিবিউট বলা হয় এবং ইন্সট্যানন্স এর মাধ্যমেই অ্যাক্সেস করা হয়। `__init__` মেথড এর সাহায্যে যেকোনো ক্লাস থেকে অবজেক্ট তৈরির সময় ব্যাসিক কিছু কাজ করে নেয়া যায়। এছাড়া ক্লাসের অনেক কাস্টম মেথড থাকতে পারে যেগুলো পক্ষান্তরে ওই ক্লাস থেকে তৈরি অবজেক্ট গুলোরই মেথড হিসেবে ব্যবহার করা যায়।

সংকলন - [নুহিল মেহেদী](https://nuhil.net)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://python.howtocode.dev/oop-python/class.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
