পাইথনে একটি ক্লাস ইনস্ট্যানশিয়েট (instantiate) করলে এর সকল ভেরিয়েবল এবং ফাংশন নতুন ইনস্ট্যান্সে ইনহেরিট হয়। কিন্তু কখনও কখনও আমরা চাই না যে প্যারেন্ট ক্লাসের কিছু ভেরিয়েবল চাইল্ড ক্লাসে ইনহেরিট হোক। এই নিবন্ধে সেটি রোধ করার দুটি পদ্ধতি দেখানো হয়েছে।
নিচের উদাহরণে দেখানো হয়েছে কিভাবে ভেরিয়েবলগুলো একটি ক্লাস থেকে ইনস্ট্যানশিয়েট হয় এবং সকল ইনস্ট্যান্সে শেয়ার হয়।
class MyClass:
listA = [] # Class variable
# Instantiate both classes
x = MyClass()
y = MyClass()
# Manipulate both classes
x.listA.append(10)
y.listA.append(20)
x.listA.append(30)
y.listA.append(40)
# Print Results
print("Instance X:", x.listA)
print("Instance Y:", y.listA)
উপরোক্ত কোড রান করলে নিচের ফলাফল পাওয়া যাবে:
Instance X: [10, 20, 30, 40] Instance Y: [10, 20, 30, 40]
দেখা যাচ্ছে, দুটি ইনস্ট্যান্স একই লিস্ট শেয়ার করছে।
আমরা __init__ মেথড ব্যবহার করে ক্লাসের ভেরিয়েবলগুলোকে প্রাইভেট (ইনস্ট্যান্স ভেরিয়েবল) বানায়। এই ভেরিয়েবলগুলো প্যারেন্ট ক্লাস ইনস্ট্যানশিয়েট হওয়ার সময় শেয়ার হয় না।
class MyClass:
def __init__(self):
self.listA = [] # Instance variable
# Instantiate both classes
x = MyClass()
y = MyClass()
# Manipulate both classes
x.listA.append(10)
y.listA.append(20)
x.listA.append(30)
y.listA.append(40)
# Print Results
print("Instance X:", x.listA)
print("Instance Y:", y.listA)
উপরোক্ত কোড রান করলে নিচের ফলাফল পাওয়া যাবে:
Instance X: [10, 30] Instance Y: [20, 40]
এখন প্রতিটি ইনস্ট্যান্সের নিজস্ব লিস্ট আছে।
এই পদ্ধতিতে, আমরা ক্লাসের বাইরে ভেরিয়েবলগুলো পুনরায় ডিক্লেয়ার করি। ইনস্ট্যানশিয়েশনের সময় ভেরিয়েবলগুলো পুনরায় ইনিশিয়ালাইজ হয় বলে সেগুলো শেয়ার হয় না।
class MyClass:
listA = []
# Instantiate both classes
x = MyClass()
y = MyClass()
x.listA = [] # Re-declare outside
y.listA = []
# Manipulate both classes
x.listA.append(10)
y.listA.append(20)
x.listA.append(30)
y.listA.append(40)
# Print Results
print("Instance X:", x.listA)
print("Instance Y:", y.listA)
উপরোক্ত কোড রান করলে নিচের ফলাফল পাওয়া যাবে:
Instance X: [10, 30] Instance Y: [20, 40]