Metaclasses এবং descriptors হল Python এর উন্নত বৈশিষ্ট্য যা meta-programming এর জন্য — ক্লাস এবং বৈশিষ্ট্য অ্যাক্সেসের আচরণ নিয়ন্ত্রণ করে। এগুলি ফ্রেমওয়ার্ক (ORMs, Pydantic) এ অনেক "জাদু" শক্তি প্রদান করে, যদিও আপনি সাধারণত অ্যাপ্লিকেশন কোডে সেগুলি সরাসরি লেখেন না।
Metaclasses — "ক্লাস যা ক্লাস তৈরি করে"
# In Python, classes are themselves OBJECTS, created by a metaclass.
# The default metaclass is `type`.
class Dog: pass
type(Dog) # <class 'type'> — Dog was created by `type`
type(Dog()) # <class 'Dog'> — instances are created by Dog
যেভাবে একটি ক্লাস উদাহরণ তৈরি করে, একটি metaclass ক্লাস তৈরি করে। মেটাক্লাস কাস্টমাইজ করে, আপনি ক্লাস তৈরি প্রক্রিয়া বাধা দিতে এবং পরিবর্তন করতে পারেন:
class Meta(type):
def __new__(mcs, name, bases, namespace):
# runs when a class USING this metaclass is DEFINED
namespace["created_by"] = "Meta" # inject an attribute into every such class
return super().__new__(mcs, name, bases, namespace)
class MyClass(metaclass=Meta):
pass
MyClass.created_by # "Meta" — injected by the metaclass at class-creation time
এটি ফ্রেমওয়ার্ককে স্বয়ংক্রিয়ভাবে ক্লাস নিবন্ধন করতে, সংজ্ঞা যাচাই করতে, বা প্রতিটি সাবক্লাসে আচরণ যোগ করতে দেয় — উদাহরণস্বরূপ ORMs কীভাবে ক্লাস বৈশিষ্ট্যগুলিকে ডাটাবেস কলামে পরিণত করে।
Descriptors — বৈশিষ্ট্য অ্যাক্সেস নিয়ন্ত্রণ করুন
একটি descriptor একটি বস্তু যা __get__/__set__/__delete__ সংজ্ঞায়িত করে, যা ঘটে তা নিয়ন্ত্রণ করে যখন একটি বৈশিষ্ট্য পড়া বা লেখা হয়:
class Positive:
def __set_name__(self, owner, name):
self.name = f"_{name}"
def __get__(self, obj, objtype=None):
return getattr(obj, self.name)
def __set__(self, obj, value):
if value < 0:
raise ValueError("must be positive") # validate on assignment
setattr(obj, self.name, value)
class Account:
balance = Positive() # a descriptor as a class attribute
a = Account()
a.balance = 100 # calls Positive.__set__ → validates
a.balance = -5 # ❌ ValueError
ডিসক্রিপ্টর বৈশিষ্ট্য অ্যাক্সেস বাধা দেয় — যাচাইকরণ, গণনাকৃত বৈশিষ্ট্য এবং অলস লোডিং সক্ষম করে। প্রকৃতপক্ষে, @property, @classmethod, এবং @staticmethod সবই descriptors হিসেবে প্রয়োগ করা হয়।
যেখানে তারা ইকোসিস্টেম শক্তি প্রদান করে
Metaclasses → Django/SQLAlchemy ORM models, ABCs, Pydantic, framework registration
Descriptors → @property, ORM fields, validation libraries, lazy attributes
এটি কেন গুরুত্বপূর্ণ
Metaclasses এবং descriptors হল meta-programming যন্ত্রপাতি Python এর অনেক শক্তিশালী লাইব্রেরির পিছনে — ORMs যা ক্লাস সংজ্ঞাগুলিকে ডাটাবেস স্কিমায় রূপান্তরিত করে, Pydantic এর মতো যাচাইকরণ ফ্রেমওয়ার্ক, এবং এমনকি @property (একটি descriptor) এর মতো বিল্ট-ইনস।
যদিও বেশিরভাগ ডেভেলপার সেগুলি সরাসরি লেখেন না (এবং সহজ সরঞ্জাম উপলব্ধ থাকলে সেগুলি ব্যবহার করা উচিত নয়), তাদের বোঝা এই ফ্রেমওয়ার্কগুলি কীভাবে তাদের ক্লাস-স্তরের কাস্টমাইজেশনের "জাদু" এবং নিয়ন্ত্রিত বৈশিষ্ট্য অ্যাক্সেস অর্জন করে তা স্পষ্ট করে।
এই জ্ঞান উন্নত লাইব্রেরি ডিজাইনের জন্য মূল্যবান, ফ্রেমওয়ার্ক আচরণ ডিবাগ করা, এবং Python এর অবজেক্ট মডেলের গভীর বোঝা — এটি মধ্যম থেকে ভাষার বিশেষজ্ঞ-স্তরের বোঝাকে আলাদা করে।
