কম্পিউটার

Python NameError:নাম 'self' সংজ্ঞায়িত নয় সমাধান

মান "স্ব" শুধুমাত্র একটি পদ্ধতির মধ্যে উপলব্ধ যখন একটি ফাংশন কল করা হয় এবং নির্দিষ্ট করা হয়।

আপনি একটি পদ্ধতিতে নির্দিষ্ট করা আর্গুমেন্টে বা একটি ফাংশনের ভিতরে একটি আর্গুমেন্ট হিসাবে "self" উল্লেখ না করে "self" অ্যাক্সেস করতে পারবেন না। অন্যথায়, আপনি ত্রুটি দেখতে পাবেন "NameError:name 'self' is not defined"।

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

NameError:নাম 'self' সংজ্ঞায়িত করা হয়নি

"স্ব" ভেরিয়েবল একটি ক্লাসের ভিতরে একটি বস্তু সম্পর্কে তথ্য ধারণ করে। একটি অবজেক্টের জন্য নির্ধারিত সমস্ত মান "স্ব" ভেরিয়েবলে উপলব্ধ।

আপনি যদি একটি পদ্ধতিতে এটি ব্যবহার করতে চান তবে "স্ব" একটি যুক্তি হিসাবে পাস করতে হবে। "স্ব" ভেরিয়েবলটি একটি পদ্ধতিতে অন্যান্য আর্গুমেন্টে ব্যবহার করা যাবে না কারণ এটি শুধুমাত্র একটি পদ্ধতির মধ্যে থেকে অ্যাক্সেসযোগ্য।

আপনি "NameError:name 'self' is not defined" ত্রুটির সম্মুখীন হন যদি আপনি:

  • একটি যুক্তি হিসাবে "স্ব" নির্দিষ্ট করবেন না
  • অন্য আর্গুমেন্টে একটি যুক্তি হিসাবে "self" ব্যবহার করুন

আসুন একে একে এই প্রতিটি দৃশ্যের মধ্য দিয়ে যাই।

দৃশ্য # 1:"স্ব" একটি যুক্তি হিসাবে তালিকাভুক্ত নয়

"স্ব" একটি পদ্ধতিতে অ্যাক্সেসযোগ্য হওয়ার জন্য একটি যুক্তি হিসাবে তালিকাভুক্ত করা আবশ্যক৷ "স্ব" একটি বিশ্ব পরিবর্তনশীল নয়। এটি একটি ক্লাসের ভিতরে স্থানীয়।

81% অংশগ্রহণকারী বলেছেন যে তারা বুটক্যাম্পে যোগ দেওয়ার পরে তাদের প্রযুক্তিগত কাজের সম্ভাবনা সম্পর্কে আরও আত্মবিশ্বাসী বোধ করেছেন। আজই একটি বুটক্যাম্পের সাথে মিলিত হন৷

গড় বুটক্যাম্প গ্র্যাড একটি বুটক্যাম্প শুরু করা থেকে শুরু করে তাদের প্রথম চাকরি খোঁজা পর্যন্ত ক্যারিয়ারের পরিবর্তনে ছয় মাসেরও কম সময় ব্যয় করেছে।

একটি ক্লাসে চলচ্চিত্র সম্পর্কে তথ্য ধারণ করে এমন একটি প্রোগ্রাম লিখুন। আমরা আমাদের শ্রেণীকে একটি কন্সট্রাকটরের সাথে সংজ্ঞায়িত করে শুরু করি যা আমাদের চলচ্চিত্র সম্পর্কে মান রাখে:

class Movie:
	def __init__(self, name, year_released):
			self.name = name
			self.year_released = year_released

আমাদের ক্লাস দুটি মান ধরে রাখতে পারে:একটি চলচ্চিত্রের নাম এবং যে বছর এটি মুক্তি পেয়েছিল। এর পরে, আমরা একটি পদ্ধতি ঘোষণা করি যা আমাদেরকে "year_released" এর মান পরিবর্তন করতে দেয়:

	def change_year(year_released):
		   self.year_released = year_released
		   print("{} was released in {}.".format(self.name, self.year_released))

আমাদের কোড পরীক্ষা করার জন্য, আমরা আমাদের ক্লাসের একটি অবজেক্ট তৈরি করি। এই বস্তুটি 1996 সালে মুক্তিপ্রাপ্ত হ্যাপি গিলমোর চলচ্চিত্রের প্রতিনিধিত্ব করে:

happy_gilmore = Movie("Happy Gilmore")
happy_gilmore.change_year(1996)

আমরা change_year() কে বলেছি আমাদের অবজেক্টের পদ্ধতি যাতে আমরা মুভিটি মুক্তির বছর 1996 এ সেট করতে পারি। আসুন আমাদের কোডটি চালান এবং দেখুন এটি কাজ করে কিনা:

Traceback (most recent call last):
  File "main.py", line 11, in <module>
	happy_gilmore.change_year()
  File "main.py", line 7, in change_year
	self.year_released = year_released
NameError: name 'self' is not defined

আমাদের কোড একটি ত্রুটি প্রদান করে৷

এই ত্রুটিটি উত্থাপিত হয়েছে কারণ আমরা আমাদের পদ্ধতির যুক্তি হিসাবে "নিজেকে" পাস করিনি। change_year()-এ প্রথম আর্গুমেন্ট হিসেবে "self" যোগ করে আমরা এই ত্রুটিটি ঠিক করি পদ্ধতি:

def change_year(self, year_released):
		self.year_released = year_released
		print("{} was released in {}.".format(self.name, self.year_released))

আমাদের কোড আবার চালান:

Happy Gilmore was released in 1996.

আমাদের কোড সফলভাবে চলে!

পরিস্থিতি #2:অন্য আর্গুমেন্টে একটি আর্গুমেন্ট হিসাবে "স্ব" ব্যবহার করা

একটি ফাংশন কল করা হলে "স্ব" মূল্যায়ন করা হয়। এর মানে হল যে আপনার কাছে একটি আর্গুমেন্ট থাকতে পারে না যা একটি ফাংশন কলে নির্দিষ্ট করা আর্গুমেন্টের তালিকায় "স্ব" কে বোঝায়।

আমাদের "বছর_রিলিজড" পদ্ধতিটি আপডেট করুন যাতে, যদি মুক্তির একটি ভিন্ন বছর নির্দিষ্ট করা না থাকে, তাহলে কনসোলে একটি বার্তা মুদ্রিত হয় যা আমাদের জানায় যে একটি চলচ্চিত্রের বছর পরিবর্তন করা হয়নি।

আমরা আমাদের কোডে একটি ডিফল্ট আর্গুমেন্ট সেট করে এটি করতে পারি:

def change_year(self, year_released=self.year_released):
	if year_released != self.year_released:
		self.year_released = year_released
		print("{} was released in {}.".format(self.name, self.year_released))
	else:
		print("This movie has not been changed.")

	print(year_released)

“year_released”-এ এখন “self.year_released”-এর ডিফল্ট মান রয়েছে। এর মানে যদি আমরা একটি মান নির্দিষ্ট না করি যার সাথে বছর পরিবর্তন করা উচিত, একটি ডিফল্ট মান সেট করা হয়। যদি আমরা একটি মান নির্দিষ্ট করি, আমরা যে মানটি নির্দিষ্ট করি তা ডিফল্টের পরিবর্তে ব্যবহার করা হয়।

যদি আমরা যে মানটি নির্দিষ্ট করি সেটি "self.year_released" এর মানের সমান না হলে, "self.year_released" এর মান পরিবর্তন করা হয়। অন্যথায়, কনসোলে একটি বার্তা মুদ্রিত হয় যা ব্যবহারকারীকে বলে যে সিনেমাটি পরিবর্তন করা হয়নি।

আমাদের if পরে বিবৃতি মূল্যায়ন করা হয়েছে, "year_released" এর মান কনসোলে প্রিন্ট করা হয়েছে।

আসুন আমাদের কোড রান করি:

Traceback (most recent call last):
  File "main.py", line 1, in <module>
	class Movie:
  File "main.py", line 6, in Movie
	def change_year(self, year_released=self.year_released):
NameError: name 'self' is not defined

আমাদের কোড একটি ত্রুটি উত্থাপন. এটি কারণ আমরা আমাদের আর্গুমেন্টের তালিকায় অন্য একটি যুক্তিতে "স্ব" ব্যবহার করার চেষ্টা করেছি।

আমরা আমাদের আর্গুমেন্টের তালিকার পরিবর্তে আমাদের ফাংশনের ভিতরে “year_released” ভেরিয়েবলের মান “self.year_released”-এ সেট করে এই ত্রুটিটি ঠিক করতে পারি:

def change_year(self, year_released=None):
	if year_released != self.year_released:
		self.year_released = year_released
		print("{} was released in {}.".format(self.name, self.year_released))
	else:
		year_released = self.year_released
		print("This movie has not been changed.")

	print(year_released)

এই কোডে, আমরা "year_released" কে "self.year_released" এর সমান হিসাবে সেট করি যদি আমরা আমাদের ফাংশন কলে "year_released" এর জন্য একটি মান নির্দিষ্ট না করি।

আমাদের কোড পরীক্ষা করার জন্য একটি নতুন মুভি অবজেক্ট তৈরি করুন:

happy_gilmore = Movie("Happy Gilmore", 1995)
happy_gilmore.change_year(1996)

আমরা ভুলভাবে উল্লেখ করেছি যে বছর হ্যাপি গিলমোর 1995 হিসাবে প্রকাশিত হয়েছিল। আমাদের change_year() ব্যবহার করে এটি পরিবর্তন করতে হবে পদ্ধতি আমাদের কোড ফিরে আসে:

Happy Gilmore was released in 1996.
1996

আমাদের কোড সফলভাবে কার্যকর করা হয়েছে. চলুন আমাদের কোড পরীক্ষা করে দেখি যে কি হবে যদি “year_released”-এর মান ইতিমধ্যেই আমরা change_year()-এ উল্লেখ করেছি তার সমান হয় পদ্ধতি:

happy_gilmore = Movie("Happy Gilmore", 1996)
happy_gilmore.change_year(1996)

আমাদের কোড ফিরে আসে:

This movie has not been changed.
1996

আমাদের কোড else চালায় আমাদের কোডে বিবৃতি এবং তারপরে আমাদের বলে যে সিনেমাটি পরিবর্তন করা হয়নি।

উপসংহার

"NameError:name 'self' সংজ্ঞায়িত করা হয় না" ত্রুটি উত্থাপিত হয় যখন আপনি একটি অবস্থানগত যুক্তি হিসাবে "self" উল্লেখ করতে ভুলে যান বা যখন আপনি আর্গুমেন্টের তালিকায় অন্য একটি আর্গুমেন্টে "self" ব্যবহার করেন।

আপনি নিশ্চিত করে এই ত্রুটিটি সমাধান করুন যে একটি ফাংশনের সমস্ত পদ্ধতি যা "self" ব্যবহার করে তাদের আর্গুমেন্টের তালিকায় "self" অন্তর্ভুক্ত করে। যদি এটি কাজ না করে, তবে নিশ্চিত করুন যে আর্গুমেন্টের তালিকায় কোন আর্গুমেন্ট তাদের ডিফল্ট মানগুলির জন্য "স্ব" এর উপর নির্ভর করে।

এখন আপনি একজন পেশাদার বিকাশকারীর মতো পাইথন ত্রুটির সমাধান করতে প্রস্তুত!


  1. পাইথনে প্রাইম বা না

  2. পাইথনে মিন স্ট্যাক

  3. পাইথনে উত্তরাধিকার

  4. পাইথনে NameError ব্যতিক্রম কিভাবে ধরবেন?