অ্যাট্রিবিউট হলো একটি অবজেক্ট, ডেটা টাইপ, বা ক্লাসের সাথে যুক্ত মান বা ফাংশন। আপনি যদি এমন একটি ভ্যালুর ওপর অ্যাট্রিবিউট কল করেন যেটার ডেটা টাইপ বা ক্লাস সেই অ্যাট্রিবিউট সাপোর্ট করে না, তবে আপনি AttributeError পাবেন।
এই গাইডে আলোচনা করা হয়েছে AttributeError কী এবং এর অর্থ কী। আমরা AttributeError-এর একটি উদাহরণের মাধ্যমে যাবো যাতে আপনি আপনার কোডে এটি কীভাবে ঠিক করবেন তা শিখতে পারেন।
পাইথন AttributeError কী?
একটি পাইথন AttributeError তখন দেখা দেয় যখন আপনি একটি অবজেক্টের অ্যাট্রিবিউট কল করার চেষ্টা করেন যেটার টাইপ সেই মেথড সাপোর্ট করে না। উদাহরণস্বরূপ, একটি স্ট্রিংয়ের ওপর পাইথন append() মেথড ব্যবহার করার চেষ্টা করলে AttributeError দেখাবে কারণ স্ট্রিং append() সাপোর্ট করে না।
একটি পাইথন ক্লাসে, আপনি মেথড এবং মান সংজ্ঞায়িত করতে পারেন যেগুলো সেই ক্লাসের অবজেক্টগুলোর জন্য শেয়ার্ড থাকে। এটাই কারণ কিছু লোক ক্লাসকে অবজেক্টের ব্লুপ্রিন্ট বলে।
একটি মেথড বা ক্লাস কল করা হলো সেই ক্লাসের একটি অ্যাট্রিবিউট রেফারেন্স করার অন্য একটি উপায়। একটি অ্যাট্রিবিউটকে একটি ব্যক্তির ফিজিক্যাল অ্যাট্রিবিউটের মতো চিন্তা করা যায়। কেউ কেউ নীল চোখ পায়। কেউ কেউ গোলাপি রঙের চুল রঙিন করে। এগুলো সব অ্যাট্রিবিউট।
একটি পাইথন ক্লাসে, একটি অ্যাট্রিবিউট হতে পারে "eye_color"। এই অ্যাট্রিবিউটটি একটি ব্যক্তির চোখের রঙ সংজ্ঞায়িত করতে পারে। একটি অ্যাট্রিবিউট হতে পারে একটি ফাংশনও। changeEyeColor() নামে একটি ফাংশন "eye_color"-এর মান পরিবর্তন করতে পারে।
ডেটা টাইপগুলোর অ্যাট্রিবিউট থাকে। উদাহরণস্বরূপ, আপনি একটি স্ট্রিংকে তালিকায় রূপান্তর করতে পাইথন join() মেথড ব্যবহার করতে পারেন। স্ট্রিং অবজেক্টগুলো join() মেথড সাপোর্ট করে।
আপনি যদি একটি ফাংশন বা মান রেফারেন্স করার চেষ্টা করেন যা একটি ক্লাস অবজেক্ট বা ডেটা টাইপের সাথে যুক্ত নয়, তবে আপনি AttributeError পাবেন।
Attribute Error পাইথন উদাহরণ
চলুন একটি প্রোগ্রাম লিখি যা দুটি জুতের তালিকা মার্জ করবে। দুটি জুতের দোকান মার্জ হচ্ছে এবং তারা সকল যুনিক জুতা যা তারা বিক্রি করে তার একটি তালিকা তৈরি করতে চায়।
শুরুতে, আসুন একটি পাইথন সেট সংজ্ঞায়িত করি যেটি Harrisons Shoes নামক স্টোর ১-এর জুতাগুলো ধারণ করে:
harrisons_shoes = {"Nike Air Force 1 07", "Nike Air Max Plus", "Adidas Gazelle"}
আমরা আমাদের সেট সংজ্ঞায়িত করতে কার্লি ব্রেস ব্যবহার করেছি। পরবর্তি, আসুন একটি সেট সংজ্ঞায়িত করি যেটি Harrisons-এ মার্জ হওয়া স্টোরটির জুতাগুলোর নাম ধারণ করে। এই জুতের দোকানটি নামক Shoe Emporium:
shoe_emporium = {"Adidas Samba", "Adidas Superstar", "Nike Air Max Plus"}
যেহেতু এই দুটি সংকলন সেট, সেগুলো শুধু যুনিক মান সংরক্ষণ করতে পারে। এর মানে আমরা সেগুলো একসাথে করলে, আমরা কোনো ডুপ্লিকেট মান ছাড়া একটি সেট পাব।
আমাদের সেট দুটো একসাথে করতে, আমরা বিল্ট-ইন ফাংশন extend() ব্যবহার করব:
harrisons_shoes.extend(shoe_emporium) print(harrisons_shoes)
extend() মেথড "shoe_emporium" সেট থেকে সকল জুতা "harrisons_shoes" সেটে যোগ করে। আমরা একটি পাইথন print() স্টেটমেন্ট ব্যবহার করি। এতে আমরা আমাদের নতুন সেটে সকল জুতা দেখতে পাব। চলুন আমাদের কোড রান করি এবং দেখি কী হয়:
Traceback (most recent call last): File "main.py", line 3, inharrisons_shoes.extend(shoe_emporium) AttributeError: 'set' object has no attribute 'extend'
আমাদের কোড একটি AttributeError ফেরত দেয়।
AttributeError পাইথন সমাধান
আমাদের এরর মেসেজ আমাদের বলে দেয় যে আমরা extend() মেথডটি একটি অবজেক্টের ওপর ব্যবহার করতে পারি না যেটার ডেটা টাইপ সেট। এর কারণ extend() একটি লিস্ট মেথড। এটি সেটগুলো দ্বারা সাপোর্ট করা হয় না।
আমরা যদি আমাদের দুটি সেট মার্জ করতে চাই, তবে আমাদের একটি যোগ চিহ্ন ব্যবহার করতে হবে:
harrisons_shoes.update(shoe_emporium) print(harrisons_shoes)
এটি "shoe_emporium" সেটের কন্টেন্ট "harrisons_shoes" সেটে যোগ করবে। তারপর আমরা "harrisons_shoes" সেটের সকল মান কনসোলে প্রিন্ট করি। চলুন আমাদের নতুন প্রোগ্রাম রান করি:
{'Nike Air Force 1 07', 'Adidas Superstar', 'Adidas Samba', 'Nike Air Max Plus', 'Adidas Gazelle'}
আমাদের প্রোগ্রাম আমাদের দুটি মূল সেট থেকে সকল জুতা সহ একটি সেট ফেরত দেয়। যদিও আমাদের দুটি মূল সেটে ছয়টি মান রয়েছিল, এখন মাত্র পাঁচটি রয়েছে। এর কারণ দুটি জুতা একই ছিল এবং সেট শুধু যুনিক মান সংরক্ষণ করতে পারে।
আমাদের প্রোগ্রাম আমাদের দুটি মূল সেট থেকে সকল জুতা সহ একটি সেট ফেরত দেয়। যদিও আমাদের দুটি মূল সেটে ছয়টি মান রয়েছিল, এখন মাত্র পাঁচটি রয়েছে। এর কারণ দুটি জুতা একই ছিল এবং সেট শুধু যুনিক মান সংরক্ষণ করতে পারে।
অন্বেষণ করার মতো অন্য AttributeErrors
AttributeErrors খুব সাধারণ। এগুলো তখন দেখা দেয় যখন আপনি ডেটা টাইপ এবং ক্লাসের অ্যাট্রিবিউট কল করার চেষ্টা করেন যেগুলো আপনি যে অ্যাট্রিবিউট রেফারেন্স করছেন সেটি সাপোর্ট করে না।
এই এররগুলো তখনও হতে পারে আপনি যদি একটি অ্যাট্রিবিউট রেফারেন্স করার সময় টাইপো করেন। পাইথন আপনার কোডকে যেনে যেন ইন্টারপ্রেট করে। আপনি যদি টাইপো করেন, তবে পাইথনের কাছে যেনে যেন যাবে যে আপনি একটি অস্তিত্বহীন অ্যাট্রিবিউট রেফারেন্স করছেন।
উদাহরণস্বরূপ, একটি তালিকা ভাগ করতে পাইথন split() মেথড ব্যবহার করা সাধারণ। কিন্তু, split() একটি স্ট্রিং মেথড এবং তাই এটি একটি তালিকা ভাগ করতে ব্যবহার করা যাবে না।
আরও পড়ার জন্য, নিচের এররগুলো রিসার্চ করুন:
- AttributeError: 'list' object has no attribute 'split'
- AttributeError: 'module' object has no attribute 'urlopen'
উপসংহার
পাইথনে অ্যাট্রিবিউট এররগুলো তখন দেখা দেয় যখন একটি অবৈধ অ্যাট্রিবিউট রেফারেন্স করা হয়। এই এররগুলো সমাধান করতে, প্রথমে চেক করুন যে আপনি যে অ্যাট্রিবিউট কল করছেন সেটি এক্সিস্ট করে কিনা। তারপর, নিশ্চিত করুন যে অ্যাট্রিবিউটটি সেই অবজেক্ট বা ডেটা টাইপের সাথে সম্পর্কিত যেটির সাথে আপনি কাজ করছেন।
আপনি যে অ্যাট্রিবিউট চান সেটি যদি একটি বিল্ট-ইন টাইপের সাথে যুক্ত থাকে কিন্তু এক্সিস্ট করে না, তবে আপনাকে একটি অল্টারনেটিভ খুঁজে বের করতে হবে। এক ডেটা টাইপের জন্য এক্সিস্ট করা অনেক অ্যাট্রিবিউটের অল্টারনেটিভ রয়েছে যেগুলো আপনি অন্য ডেটা টাইপে ব্যবহার করতে পারেন। উদাহরণস্বরূপ, সেটের সাথে extend() মেথড নেই কিন্তু আপনি union() ব্যবহার করতে পারেন দুটি সেট জোড়া দিতে।
পাইথন কোড লিখা সম্পর্কে আরও জানতে, আমাদের How to Learn Python গাইড পড়ুন।