মেটাপ্রোগ্রামিং শব্দটি কম্পিউটার প্রোগ্রামিংকে বোঝায় যেখানে কম্পিউটার প্রোগ্রামগুলি হেরফের করার চেষ্টা করে বা নিজের সম্পর্কে জ্ঞান রাখে। পাইথন মেটাক্লাস নামে একটি নতুন ধরনের ক্লাসের মাধ্যমে ক্লাসের জন্য মেটাপ্রোগ্রামিং সমর্থন করে।
পাইথনে মেটাক্লাসের মাধ্যমে মেটা-প্রোগ্রামিং হল ফাংশন এবং ক্লাস তৈরি করা যা কোড পরিবর্তন, মোড়ানো বা বিদ্যমান কোড তৈরি করে ম্যানিপুলেট করে।
মেটা-প্রোগ্রামিং এর মূল বৈশিষ্ট্য হল −
- মেটাক্লাসেস
- ডেকোরেটর
- শ্রেণি-সজ্জাকারীরা
মেটাক্লাস কি
মেটাক্লাসের একটি খুব সীমাবদ্ধ সংজ্ঞা হতে পারে, একটি শ্রেণী যা একটি শ্রেণী তৈরি করে। পাইথন একটি অবজেক্ট-ওরিয়েন্টেড ভাষা যেখানে সবকিছুই একটি অবজেক্ট এবং ক্লাসগুলিও এর ব্যতিক্রম নয়। ক্লাস কীওয়ার্ড দিয়ে একটি ক্লাস সংজ্ঞায়িত করা, পাইথন আসলে এটি কার্যকর করে এবং তারপরে একটি অবজেক্ট তৈরি করে। যেহেতু এটি একটি অবজেক্ট, আপনি ফাংশন প্যারামিটার হিসাবে বরাদ্দ, অনুলিপি, বৈশিষ্ট্য যোগ করতে পারেন এবং আরও অনেক কিছু করতে পারেন। মেটাক্লাস ব্যবহার করে আমাদের ক্লাসের জেনারেশন নিয়ন্ত্রণ করতে দেয়, যেমন ক্লাসের বৈশিষ্ট্য পরিবর্তন করা, সম্পত্তির বৈধতা পরীক্ষা করা ইত্যাদি।
পাইথন বিল্ট-ইন মেটাক্লাস
সমস্ত শ্রেণীর মেটাক্লাস হল প্রকার
class a: pass print(type(a))
আউটপুট:
<class 'type'>
উপরের আউটপুট থেকে আমরা দেখতে পাচ্ছি যে “a”(class) হল ক্লাস টাইপের একটি অবজেক্ট। আমরা এটাও বলতে পারি যে "a" (শ্রেণী) হল ক্লাস টাইপের একটি উদাহরণ। তাই টাইপ একটি মেটাক্লাস. তাই পাইথনে, প্রতিটি ক্লাস বিল্ট-ইন মেটাক্লাস টাইপের অন্তর্গত।
পাইথন ক্লাস তৈরি করতে মেটাক্লাস ব্যবহার করে
আমরা উপরের উদাহরণে দেখেছি, টাইপটি ডিফল্ট মেটাক্লাস। আমরা এই ডিফল্ট মেটাক্লাস(টাইপ) এর সাহায্যে একটি নতুন ক্লাস তৈরি করতে পারি।
>>> class hello(object): pass
এইভাবেও ম্যানুয়ালি তৈরি করা যায় -
>>> hello = type('hello', (), {}) >>> print(hello)# returns a class object >>> print(hello()) # creates an instance with the class <__main__.hello object at 0x05D86830>এ
টাইপ ক্লাসের বৈশিষ্ট্যগুলি সংজ্ঞায়িত করতে একটি অভিধান গ্রহণ করে, তাই
>>> class hello(object): world = True
উপরের কোডটি,
এর মতhello = type('hello', (), {'world' : True})
একটি মেটাক্লাস তৈরি করুন
তাই কখন একটি মেটাক্লাস তৈরি করবেন? যখন আমি একটি ক্লাস তৈরি নিয়ন্ত্রণ করতে চাই, যেমন একটি ক্লাসের বৈশিষ্ট্য যাচাই বা সংশোধন করা।
ক্লাস -
এর ইনস্ট্যান্টেশন প্রক্রিয়া- __new__() কল করে একটি উদাহরণ তৈরি করুন৷
- উপরে তৈরি ইন্সট্যান্স শুরু করতে __init__() এ কল করুন
তাই যখন আমরা একটি কাস্টম মেটাক্লাস তৈরি করি, তখন আমরা আসলে প্যারেন্ট ক্লাসের __new__() বা __init__ পদ্ধতি পরিবর্তন করি।
উদাহরণ1 − মেটাক্লাস যা ক্লাসের বৈশিষ্ট্যগুলিকে সংশোধন করেছে
class LowercaseMeta(type): def __new__(mcs, name, bases, attrs): lower_attrs = {} for k, v in attrs.items(): if not k.startswith('__'): lower_attrs[k.lower()] = v else: lower_attrs[k] = v return type.__new__(mcs, name, bases, lower_attrs) class LowercaseClass(metaclass=LowercaseMeta): BAR = True def HELLO(self): print('hello') print(dir(LowercaseClass)) LowercaseClass().hello()
আউটপুট
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'bar', 'hello'] hello
Example2 − ক্লাসে একটি অতিরিক্ত বৈশিষ্ট্য যোগ করুন
class ListMeta(type): def __new__(mcs, name, bases, attrs): attrs['add'] = lambda self, value: self.append(value) return type.__new__(mcs, name, bases, attrs) class MyList(list, metaclass=ListMeta): pass l = MyList() l.add(1) print(l) def class_decorator(cls): cls.add = lambda self, value: self.append(value) return cls @class_decorator class MyList(list): pass l = MyList() l.append(1) print(l)
আউটপুট
[1] [1]
__মেটাক্লাস__ বৈশিষ্ট্য
পাইথনে, হয় আমাদের একটি ক্লাস আছে বা এর একটি বেসের একটি __মেটাক্লাস__ অ্যাট্রিবিউট আছে, এটিকে মেটাক্লাস হিসাবে নেওয়া হয় অন্য প্রকারটি মেটাক্লাস। আমরা যখন −
হিসাবে একটি ক্লাস লিখি তখন আমাদের __metaclass__ বৈশিষ্ট্য থাকতে পারেতাই কি হবে যখন আমরা সংজ্ঞায়িত করি, −
এর মত একটি শ্রেণীclass hello(object): x = 10
উপরে, hello ক্লাসের কোন __metaclass__ বৈশিষ্ট্য নেই, তাই এর পরিবর্তে টাইপটি ব্যবহার করা হয়, এবং ক্লাস তৈরি করা হয় −
hello = type(name, bases, dict)
যদি আমাদের হ্যালোতে একটি মেটাক্লাস সংজ্ঞায়িত থাকে -
class hello(object): __metaclass__ = myMetaClass pass
এখন উপরের উদাহরণে, টাইপের পরিবর্তে myMetaClass ব্যবহার করে ক্লাস তৈরি করা হয়েছে। হ্যালো =myMetaClass(নাম, বেস, ডিক্ট)