পাইথন ক্লাসগুলোকে ইনস্ট্যানসিয়েট, বা কল, করতে হয় তাদের মেথড অ্যাক্সেস করার আগে। আপনি যদি একটি ক্লাসের অবজেক্ট ইনস্ট্যানসিয়েট করা ভুলে যান এবং একটি ক্লাস মেথড অ্যাক্সেস করার চেষ্টা করেন, আপনি "missing 1 required positional argument: 'self'" বলতে একটি এরর এনকাউন্টার করবেন।
এই গাইডে, আমরা এই এরর কী বোঝায় এবং কেন এটি উঠে সেটি আলোচনা করব। আমরা এই এররটি একশনে একটি উদাহরণের মাধ্যমে যাব যাতে আপনি কীভাবে এটি ফিক্স করবেন সেটি শিখতে পারেন।
missing 1 required positional argument: 'self'
পজিশনাল আর্গুমেন্ট হল ডেটা যা একটি ফাংশনে পাস করা হয়। একটি ক্লাসে, প্রতিটি ফাংশনকে "self" ভ্যালু দিতে হয়। "self" এর ভ্যালু জাভাস্ক্রিপ্টের "this" এর মতো। "self" একটি ক্লাসের অবজেক্টে স্টোর করা ডেটা রিপ্রেজেন্ট করে।
যখন আপনি একটি ক্লাস মেথড কল করেন সেটি আগে সেই ক্লাসের একটি অবজেক্ট ইনস্ট্যানসিয়েট না করেই, আপনি একটি এরর পান। এর কারণ হল "self" এর কোনো ভ্যালু নেই যতক্ষণ না একটি অবজেক্ট ইনস্ট্যানসিয়েট হয়।
"missing 1 required positional argument: 'self'" এররটি করার সবচেয়ে সাধারণ ভুলগুলো হল:
- একটি ক্লাসের অবজেক্ট ইনস্ট্যানসিয়েট করা ভুলে যাওয়া
- একটি ক্লাস ইনস্ট্যানসিয়েট করার ভুল সিনট্যাক্স ব্যবহার করা
চলুন এই কারণগুলো একে একে ওয়াকথ্রু করি।
কারণ #১: একটি অবজেক্ট ইনস্ট্যানসিয়েট করা ভুলে যাওয়া
একটি অবজেক্ট অবশ্যই ইনস্ট্যানসিয়েট হওয়া উচিত একটি ক্লাসে একটি মেথড অ্যাক্সেস করার আগে।
একটি ক্লাস ডিফাইন করি যা একটি ভিডিও গেমে একটি হিরো সম্পর্কে ইনফরমেশন স্টোর করে:
class Hero:
def __init__(self, name, player_type):
self.name = name
self.player_type = player_type
পরবর্তীতে, আমরা আমাদের ক্লাসে একটি ফাংশন অ্যাড করি। ক্লাসের ভিতরের ফাংশনগুলাকে মেথড বলা হয়। এই মেথডটি একটি প্লেয়ারের নাম এবং তাদের প্লেয়ার টাইপ প্রিন্ট আউট করে:
def show_player(self):
print("Player Name: " + self.name)
print("Player Type: " + self.player_type)
আমাদের ক্লাস অ্যাক্সেস করার চেষ্টা করি যাতে আমরা একটি প্লেয়ার তৈরি করতে পারি:
luke = Hero.show_player()
আমরা একটি অবজেক্ট তৈরি করেছি যেটি "luke" ভেরিয়েবলে অ্যাসাইন করা আছে। এই অবজেক্টটি Hero ক্লাস থেকে ডেরাইভড। আমরা show_player() মেথড কল করি প্লেয়ার সম্পর্কে ইনফরমেশন দেখানোর জন্য।
চলুন আমাদের কোড সব মিলিয়ে রান করি এবং দেখি কী হয়:
Traceback (most recent call last): File "main.py", line 10, inluke = Hero.show_player() TypeError: show_player() missing 1 required positional argument: 'self'
আমাদের কোড ফেইল করল। এর কারণ হল আমরা Hero এর একটি অবজেক্ট ইনস্ট্যানসিয়েট করিনি। Hero.show_player() কাজ করে না কারণ আমরা একটি হিরো তৈরি করিনি যার ইনফরমেশন ডিসপ্লে করা যায়।
এই এররটি সমাধান করতে, আমরা প্রথমে একটি অবজেক্ট ইনস্ট্যানসিয়েট করি show_player() কল করার আগে:
luke = Hero("Luke", "Mage")
luke.show_player()
আবার আমাদের কোড রান করি:
Player Name: Luke Player Type: Mage
আমাদের কোড সফলভাবে রান হল! আমরা প্রথমে "luke" নামে একটি ভেরিয়েবল ডিক্লেয়ার করেছি যেটি লুক নামের একটি প্লেয়ার সম্পর্কে ইনফরমেশন স্টোর করে। লুকের প্লেয়ার টাইপ "Mage"। এখন যেহেতু আমরা সেই অবজেক্টটি ইনস্ট্যানসিয়েট করেছি, আমরা show_player() মেথড কল করতে পারি।
কারণ #২: ভুলভাবে একটি ক্লাস ইনস্ট্যানসিয়েট করা
"missing 1 required positional argument: 'self'" এররটি হয়ে থাকতে পারে যখন আপনি ভুলভাবে একটি ক্লাস ইনস্ট্যানসিয়েট করেন। নিচের কোডটি বিবেচনা করুন:
luke = Hero luke.show_player()
যদিও এই কোডটি আমাদের লাস্ট উদাহরণের সমাধানের সাথে সিমিলার, এটি ভুল। এর কারণ হল আমরা Hero শব্দের পর কোনো প্যারেনথেসিস অ্যাড করিনি। এই প্যারেনথেসিস মিস করলে, আমাদের প্রোগ্রাম বুঝতে পারে না যে আমরা একটি ক্লাস ইনস্ট্যানসিয়েট করতে চাই।
এই সমস্যাটি সমাধান করুন Hero-র পর প্যারেনথেসিস যোগ করে এবং রিকোয়ায়ারড আর্গুমেন্ট, "name" এবং "player_type" স্পেসিফাই করে:
luke = Hero("Luke", "Mage")
luke.show_player()
আমাদের কোড এখন সফলভাবে রান হয় এবং আমাদের প্লেয়ার সম্পর্কে ইনফরমেশন রিটার্ন করে:
Player Name: Luke Player Type: Mage
উপসংহার
"missing 1 required positional argument: 'self'" এররটি উঠে যখন আপনি একটি ক্লাস মেথড কল করার আগে সেই ক্লাসের একটি অবজেক্ট ইনস্ট্যানসিয়েট করেন না। এই এররটি তখনও উঠে যখন আপনি ভুলভাবে একটি ক্লাস ইনস্ট্যানসিয়েট করেন।
এই এররটি সমাধান করতে, নিশ্চিত করুন যে আপনি প্রথমে একটি ক্লাসের একটি অবজেক্ট ইনস্ট্যানসিয়েট করেন সেই ক্লাসের যেকোনো মেথড অ্যাক্সেস করার চেষ্টা করার আগে। তারপর, চেক করুন যে আপনি একটি অবজেক্ট ইনস্ট্যানসিয়েট করার সঠিক সিনট্যাক্স ব্যবহার করছেন।
এখন আপনি এই সাধারণ এররটি এক্সপার্ট পাইথন ডেভেলপারের মতো সমাধান করার জন্য রেডি!