ধরো, তোমার একটি ই-কমার্স অ্যাপ আছে, সেই অ্যাপে Shopping নামের একটি ক্লাস(class) আছে। Shopping ক্লাসের মধ্যে cart নামের একটি attribute এবং add_to_cart নামের একটি method আছে।
class Shop ping:
cart = [ ]
def add_to_cart(self, item):
self.cart.append(item)
একদিন একজন কাস্টমার একটি টি-শার্ট অর্ডার করলো, তারপর তোমার cart attribute টি হবে এরকম:
class Shopping:
cart = [ ]
def add_to_cart(self, item):
self.cart.append(item)
customer1 = Shopping()
customer1.add_to_cart('T-shirt')
print(customer1.cart)
পরের দিন আরেকজন কাস্টমার, আরেকটি জুতা অর্ডার করলো।
class Shopping:
cart = [ ]
def add_to_cart(self, item):
self.cart.append(item)
customer1 = Shopping()
customer1.add_to_cart('T-shirt')
print(customer1.cart)
customer2 = Shopping()
customer2.add_to_cart('Shoes')
print(customer2.cart)
উপরের কোডটি রান করলে, একটি গরবর দেখতে পাবে।
আউটপুটের দ্বিতীয় লাইনে দুইটা আইটেম, জুতা আর টি-শার্ট দুটিই দেখতে পাবে। কিন্তু আমাদের Customer 2 শুধুমাত্র জুতা অর্ডার দিয়েছিল।
এটা ঘটেছে কারণ, Shopping ক্লাসের মধ্যে যে এট্রিবিউটটি(cart) ডিক্লেয়ার করা হয়েছে, সেটি হলো একটি class level attribute.
Class level attribute গুলো ক্লাস থেকে তৈরি হওয়া সবগুলো অবজেক্ট এর মধ্যে শেয়ার হয়। এর কারণে আমাদের Shopping ক্লাসে সমস্যাটি হয়েছে।
এ সমস্যা সমাধানে, আমাদেরকে cart attribute টি একটি constructor এরমধ্যে তৈরি করতে হবে। কনস্ট্রাক্টর এর মধ্যে তৈরি করা এট্রিবিউট গুলো, ক্লাস থেকে তৈরি প্রত্যেকটি অবজেক্টের জন্য ভিন্ন ভিন্ন হয়। এটাকে বলে instance attribute.
class Shopping:
def __init__(self):
self.cart = [ ]
def add_to_cart(self, item):
self.cart.append(item)
এবার খেয়াল করলে দেখবে, customer1 আর customer2 অবজেক্টের ভিন্ন ভিন্ন cart এট্রিবিউট আছে।