ম্যাজিক মেথড

পাইথনে কিছু বিশেষ ধরনের বিল্ট ইন মেথড আছে যেগুলোকে ম্যাজিক মেথড বলা হয়। এগুলার চেনার খুব সহজ উপায় হচ্ছে এদের নামের দুই পাসেই দুটো করে আন্ডারস্কোর সিম্বল থাকে। অর্থাৎ, __init__ মেথডের মত। এই মেথডের সঙ্গে ইতোমধ্যে আমাদের পরিচয় হয়েছে। কোন ক্লাসে এই ম্যাজিক মেথড ব্যবহার করলে এবং পরবর্তীতে সেই ক্লাসের ইন্সট্যান্স তৈরির সময় এই ম্যাজিক মেথডটি স্বয়ংক্রিয় ভাবেই কল হয় যাতে করে এর মাধ্যমে কিছু সেটআপ রিলেটেড কাজ করে নেয়া যায়।

এই মেথড গুলোকে ভাষায় প্রকাশ করার সময় একটু জটিলতা হয়। যেমন, "আন্ডারস্কোর আন্ডারস্কোর ইনিট আন্ডারস্কোর আন্ডারস্কোর" এভাবে বললে অদ্ভুত শোনায়। তাই এদেরকে সুন্দর ভাবে "dunders" তথা "ডাণ্ডার ইনিট" এভাবে বলা হয়ে থাকে।

তো, এই __init__ মেথড বাদেও অনেক গুলো ম্যাজিক মেথড আছে পাইথনে। ম্যাজিক মেথডের খুব বহুল ব্যবহার দেখা যায় অপারেটর অভারলোডিং এর সময় যা পরের চ্যাপ্টারেই আলোচনা করা হয়েছে। প্রত্যেকটি অপারেটর এর জন্যই একটি ম্যাজিক মেথড আছে। যেমন, + অপারেটর এর জন্য ম্যাজিক মেথডটি হচ্ছে __add__

ঘটনাটি এভাবে ঘটে, যদি আমাদের এমন একটি এক্সপ্রেশন থাকে x+y এবং x বস্তুত K ক্লাসের ইন্সট্যান্স হয়। তখন পাইথন K ক্লাসের ডেফিনেশন চেক করবে। যদি K ক্লাসের একটি মেথড থাকে __add__ তাহলে সেটাকে কল করা হবে এভাবেঃ x.__add__(y)

কিছু কমন অপারেটরের ম্যাজিক মেথডঃ
__sub__ হচ্ছে - জন্য
__mul__ হচ্ছে * জন্য
__truediv__ হচ্ছে / জন্য
__floordiv__ হচ্ছে // জন্য
__mod__ হচ্ছে % জন্য
__pow__ হচ্ছে ** জন্য
__and__ হচ্ছে & জন্য
__xor__ হচ্ছে ^ জন্য
__or__ হচ্ছে | জন্য

তুলনা করার অপারেটর গুলোর জন্যও পাইথনে ম্যাজিক মেথড আছেঃ
__lt__ হচ্ছে < জন্য
__le__ হচ্ছে <= জন্য
__eq__ হচ্ছে == জন্য
__ne__ হচ্ছে != জন্য
__gt__ হচ্ছে > জন্য
__ge__ হচ্ছে >= জন্য

এছাড়াও আরও অনেক ম্যাজিক মেথড আছে পাইথনে যেমন - __len__ __getitem__ __setitem__ __delitem__ __iter__ __contains__ ইত্যাদি