python-basic

⌘K
  1. Home
  2. python-basic
  3. OOP
  4. মেটাক্লাস (Metaclass)

মেটাক্লাস (Metaclass)

মেটাক্লাস (Metaclass) সহজ ভাষায়

Python এর মেটাক্লাস হচ্ছে এমন একটি ক্লাস যা অন্য ক্লাসগুলো তৈরি করে। সাধারণভাবে আমরা যখন কোনো ক্লাস তৈরি করি, সেটি অবজেক্ট তৈরি করে। কিন্তু মেটাক্লাস এমন একটি ক্লাস যা নিজেই ক্লাস তৈরি করে।

এখন সহজ উদাহরণ দিয়ে বুঝাই:

১. ক্লাস এবং অবজেক্ট সম্পর্কে রিফ্রেশ

  • ক্লাস: ক্লাস হচ্ছে একটি নীলনকশা (blueprint), যা থেকে অবজেক্ট তৈরি হয়।
  • অবজেক্ট: ক্লাসের instance বা বস্তু।
class MyClass:
    pass

obj = MyClass()  # এখানে obj একটি অবজেক্ট

এখানে MyClass একটি ক্লাস, এবং আমরা সেই ক্লাস থেকে obj নামে একটি অবজেক্ট তৈরি করেছি।

২. তাহলে মেটাক্লাস কী?

মেটাক্লাস হচ্ছে এমন কিছু যা ক্লাস তৈরি করে। তুমি যেভাবে MyClass থেকে obj নামে অবজেক্ট তৈরি করেছো, ঠিক একইভাবে মেটাক্লাস থেকে ক্লাস তৈরি হয়।

Python এ ডিফল্ট মেটাক্লাস হচ্ছে type। অর্থাৎ, যখনই তুমি কোনো ক্লাস তৈরি করো, Python এর type মেটাক্লাস এটি তৈরি করে।

# MyClass আসলে type মেটাক্লাস দ্বারা তৈরি
print(type(MyClass))  # Output: <class 'type'>

এখানে দেখা যাচ্ছে MyClass এর type আসলে type ক্লাস। অর্থাৎ Python এ type ক্লাস দ্বারা অন্য সব ক্লাস তৈরি হয়।

৩. মেটাক্লাস কাস্টমাইজ করার প্রয়োজন কেন?

মেটাক্লাস ব্যবহার করে তুমি ক্লাস তৈরির প্রক্রিয়া কন্ট্রোল করতে পারো। উদাহরণস্বরূপ, ধরো তুমি এমন একটি সিস্টেম তৈরি করতে চাও যেখানে প্রতিটি ক্লাসের নাম একটি নির্দিষ্ট নিয়ম মেনে তৈরি হবে, বা ক্লাস তৈরি হওয়ার সময় অটোমেটিক কিছু অ্যাট্রিবিউট যোগ করা হবে। এই ধরনের কাজ করতে মেটাক্লাস ব্যবহার করা হয়।

৪. কাস্টম মেটাক্লাস তৈরি করা

এখন আমরা কাস্টম মেটাক্লাস তৈরি করবো এবং দেখবো কীভাবে এটি ক্লাস তৈরি করার প্রক্রিয়া কন্ট্রোল করতে পারে।

# একটি কাস্টম মেটাক্লাস তৈরি করা
class MyMeta(type):
    def __new__(cls, name, bases, dct):
        print(f"Creating class: {name}")
        return super().__new__(cls, name, bases, dct)

# মেটাক্লাস ব্যবহার করে ক্লাস তৈরি করা
class MyClass(metaclass=MyMeta):
    pass

# অবজেক্ট তৈরি করা
obj = MyClass()

কী ঘটলো এখানে:

  1. MyMeta: এটি একটি কাস্টম মেটাক্লাস। আমরা __new__ মেথড ওভাররাইড করে ক্লাস তৈরি হওয়ার প্রক্রিয়া কন্ট্রোল করছি। যখনই নতুন কোনো ক্লাস তৈরি হবে, এটি কনসোল এ “Creating class: class_name” প্রিন্ট করবে।
  2. metaclass=MyMeta: আমরা MyClass তৈরি করার সময় বলে দিয়েছি যে এই ক্লাসটি তৈরি করার জন্য MyMeta মেটাক্লাসটি ব্যবহার করা হবে। তাই MyMeta মেটাক্লাসটি ক্লাস তৈরির সময় কার্যকর হবে।
  3. ক্লাস তৈরি হওয়ার সময়: যখন MyClass তৈরি হয়, তখন MyMeta মেটাক্লাসের __new__ মেথডটি চালু হয় এবং প্রিন্ট করে “Creating class: MyClass”।

৫. কাস্টম মেটাক্লাসের সুবিধা

  • তুমি ক্লাস তৈরির প্রক্রিয়া নিয়ন্ত্রণ করতে পারো।
  • প্রতিটি ক্লাসের মধ্যে ডিফল্ট অ্যাট্রিবিউট বা মেথড যোগ করতে পারো।
  • ক্লাস তৈরির আগে বা পরে ভ্যালিডেশন করতে পারো।

মেটাক্লাস নিয়ে সহজ রিয়াল-লাইফ উদাহরণ

কল্পনা করো তুমি একটি অফিসের জন্য সিস্টেম তৈরি করছো যেখানে বিভিন্ন বিভাগ রয়েছে। প্রত্যেক বিভাগের জন্য কিছু নির্দিষ্ট নিয়ম বা শর্ত থাকবে। ধরো, প্রতিটি বিভাগের ম্যানেজারের নাম থাকতে হবে এবং বিভাগের বাজেট সর্বনিম্ন ১০,০০০ টাকা হতে হবে। যদি কেউ ভুল করে বাজেট কম দিয়ে বিভাগ তৈরি করতে চায়, তাহলে সেটি রোধ করতে হবে।

এই সমস্যার সমাধানে মেটাক্লাস ব্যবহার করা যেতে পারে। এখানে মেটাক্লাস কাজ করবে নিশ্চিত করতে যে প্রতিটি বিভাগ সঠিক নিয়ম মেনে তৈরি হচ্ছে।

যদি মেটাক্লাস ব্যবহার না করো:

class Department:
    def __init__(self, name, manager, budget):
        self.name = name
        self.manager = manager
        self.budget = budget

# একটি সঠিক বিভাগ তৈরি করা
dept1 = Department('IT', 'Alice', 20000)

# একটি ভুল বিভাগ তৈরি করা (বাজেট কম)
dept2 = Department('HR', 'Bob', 5000)  # এখানে বাজেট কম, কিন্তু কোড কাজ করবে

এখানে কোনো নিয়ম নেই যে বাজেট ১০,০০০ টাকার কম হতে পারবে না। ফলে কেউ ভুল করে বাজেট কম দিলেও বিভাগ তৈরি হয়ে যাবে, যা আমাদের সমস্যায় ফেলবে।

যদি মেটাক্লাস ব্যবহার করি:

class DepartmentMeta(type):
    def __new__(cls, name, bases, dct):
        # নিশ্চিত করা প্রতিটি বিভাগে 'manager' এবং 'budget' ফিল্ড আছে
        if 'manager' not in dct:
            raise ValueError("Every department must have a manager!")
        if 'budget' in dct and dct['budget'] < 10000:
            raise ValueError("Budget must be at least 10,000!")
        return super().__new__(cls, name, bases, dct)

# Department ক্লাসে মেটাক্লাস যোগ করা
class ITDepartment(metaclass=DepartmentMeta):
    manager = "Alice"
    budget = 20000

class HRDepartment(metaclass=DepartmentMeta):
    manager = "Bob"
    budget = 5000  # এটি কাজ করবে না, কারণ বাজেট ১০,০০০ টাকার কম

# সঠিকভাবে কাজ করা বিভাগ
it_dept = ITDepartment()

# এই বিভাগটি তৈরি হবে না, কারণ বাজেট কম
hr_dept = HRDepartment()  # ValueError: Budget must be at least 10,000!

কী হলো এখানে?

  1. মেটাক্লাস (DepartmentMeta): এই মেটাক্লাসের মাধ্যমে আমরা নিশ্চিত করেছি যে প্রতিটি বিভাগে একটি ম্যানেজারের নাম এবং বাজেট অবশ্যই থাকতে হবে। বাজেট যদি ১০,০০০ টাকার কম হয়, তাহলে সেটি তৈরি করা যাবে না।
  2. ক্লাস তৈরি হওয়ার সময় চেকিং: যখনই একটি নতুন বিভাগ তৈরি হবে (যেমন ITDepartment বা HRDepartment), মেটাক্লাস প্রথমে সেই ক্লাসের নিয়ম চেক করবে। যদি কোনো নিয়ম ভাঙা হয়, তাহলে ValueError তুলে দেবে এবং ক্লাসটি তৈরি হবে না।

মেটাক্লাস কেন দরকার?

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

বাস্তব জীবনে কোথায় মেটাক্লাস দরকার হতে পারে?

  • ফ্রেমওয়ার্ক ডেভেলপমেন্টে: যেমন Django বা Flask-এর মতো ফ্রেমওয়ার্কে। মেটাক্লাসের মাধ্যমে অনেক ধরনের ফিচার যোগ করা হয়।
  • এন্টারপ্রাইজ সফটওয়্যার: যেখানে প্রতিটি ক্লাস বা মডিউল তৈরির আগে অনেক ধরনের চেক এবং শর্ত পালন করতে হয়।
  • বড় প্রজেক্টে: যখন অনেক ক্লাস এবং ইনহেরিট্যান্স থাকে, মেটাক্লাস ব্যবহার করে নিয়ম ঠিক করে দেওয়া যায়।

সংক্ষেপে:

মেটাক্লাস এমন একটি টুল যা ক্লাস তৈরি হওয়ার আগে নিয়ম বা শর্ত যোগ করার জন্য ব্যবহার করা হয়। এটি ক্লাস তৈরির সময় ডেটা ভ্যালিডেশন, কন্ট্রোল, এবং নিয়ম অনুসরণ করানোর জন্য কাজে লাগে।

প্রশ্ন:

আমি Django-তে class Meta নামে একটি অপশন দেখেছি যা মডেলে লেখা হয়। এটি কি আমরা আগে যে মেটাক্লাস (metaclass) নিয়ে আলোচনা করেছি সেই একই জিনিস?

উত্তর:

না, Django-তে মডেলের ভিতরে যে class Meta লেখা হয়, তা Python-এর মেটাক্লাস (metaclass) নয়। যদিও নামের মিল আছে, কিন্তু কার্যকারিতায় তারা আলাদা।

How can we help?