Metaclasses
পাইথনে ক্লাস নিজেই একটি অবজেক্ট। এই ক্লাস অবজেক্টটি যে 'ব্লু-প্রিন্ট' থেকে তৈরি হয়, তাকে বলা হয় Metaclass। সহজ কথায়, মেটাক্লাস হলো একটি ক্লাসের ক্লাস।
১. The type Class
পাইথনে সব ক্লাসের ডিফল্ট মেটাক্লাস হলো type। আপনি যখন একটি ক্লাস লেখেন, তখন পাইথন ব্যাকগ্রাউন্ডে type() ব্যবহার করে সেটি তৈরি করে।
class MyClass:
pass
print(type(MyClass)) # <class 'type'>২. Creating a Custom Metaclass
আপনি যদি চান আপনার ক্লাসগুলো তৈরি হওয়ার সময় কোনো নির্দিষ্ট নিয়ম মেনে চলুক (যেমন- সব মেথডের নাম বড় হাতের হতে হবে), তবে আপনি কাস্টম মেটাক্লাস ব্যবহার করতে পারেন। এর জন্য type কে ইনহেরিট করতে হয় এবং __new__ মেথডটি ওভাররাইড করতে হয়।
class MyMeta(type):
def __new__(cls, name, bases, dct):
print(f"ক্লাস তৈরি হচ্ছে: {name}")
# আপনি এখানে চাইলে dct (ডিকশনারি) মডিফাই করতে পারেন
return super().__new__(cls, name, bases, dct)
class MyClass(metaclass=MyMeta):
pass৩. কেন ব্যবহার করবেন?
- API Validation: লাইব্রেরি বা ফ্রেমওয়ার্ক ডেভেলপারদের জন্য এটি খুব কাজের। যেমন- Django বা SQLAlchemy এটি ব্যাপকভাবে ব্যবহার করে।
- Singleton Pattern: নিশ্চিত করা যে একটি ক্লাসের শুধু একটিই অবজেক্ট তৈরি হবে।
- Interface Enforcement: চাইল্ড ক্লাসগুলো ঠিকঠাক মেথড ইমপ্লিমেন্ট করছে কি না তা ক্লাস তৈরি হওয়ার সময় চেক করা।
৪. abstractmethod vs Metadata
অ্যাবস্ট্রাকশন যখন রানটাইমে এরর দেয়, মেটাক্লাস তখন ক্লাস লোড হওয়ার সময় বা তৈরির সময়ই এরর দিতে পারে।
সতর্কতা
মেটাক্লাস হলো অত্যন্ত পাওয়ারফুল একটি টুল। তবে সাধারণ অ্যাপ্লিকেশন ডেভেলপমেন্টে এটি খুব কমই প্রয়োজন হয়। পাইথনের প্রতিষ্ঠাতা টিমোথি পিটার্সের মতে—"Metaclasses are deeper magic than 99% of users should ever worry about."