পাইথনে ভেরিয়েবল স্কোপ (scope) বোঝা ক্লাস ডিজাইন এবং বাগ এড়াতে অত্যন্ত গুরুত্বপূর্ণ। নিচে ক্লাসের বাইরের (গ্লোবাল), ক্লাসের ভিতরে (ক্লাস ভেরিয়েবল), এবং মেথডের ভিতরে (লোকাল) ভেরিয়েবলের ব্যবহার দেখানো হলো।
১. ক্লাসের বাইরে ডিফাইন করা ভেরিয়েবল (গ্লোবাল/মডিউল লেভেল)
# ক্লাসের বাইরে ডিফাইন করা ভেরিয়েবল
outVar = 'outside_class'
print("OutSide_class1:", outVar)
class Ctest:
print("OutSide_class2:", outVar) # ক্লাস বডি এক্সিকিউট হয়ে গেলে প্রিন্ট হয়
def access_method(self):
print("OutSide_class3:", outVar) # মেথড কল হলে প্রিন্ট হয়
# অবজেক্ট তৈরি করে মেথড কল
uac = Ctest()
uac.access_method()
# অন্য ক্লাসও অ্যাক্সেস করতে পারে
class Another_Ctest_class:
print("OutSide_class4:", outVar)
def another_access_method(self):
print("OutSide_class5:", outVar)
uaac = Another_Ctest_class()
uaac.another_access_method()
আউটপুট:
OutSide_class1: outside_class OutSide_class2: outside_class OutSide_class3: outside_class OutSide_class4: outside_class OutSide_class5: outside_class
২. মেথডের ভিতরে ডিফাইন করা ভেরিয়েবল (লোকাল স্কোপ)
class Ctest:
def access_method(self):
# মেথডের ভিতরে ডিফাইন করা ভেরিয়েবল
inVar = 'inside_method'
print("Inside_method3:", inVar)
uac = Ctest()
uac.access_method()
# অন্য ক্লাসের মেথড থেকে অ্যাক্সেস করা যাবে না
class AnotherCtest:
def access_method(self):
# print(inVar) # NameError: name 'inVar' is not defined
pass
uaac = AnotherCtest()
uaac.access_method()
৩. ক্লাস ভেরিয়েবল vs ইনস্ট্যান্স ভেরিয়েবল
class MyClass:
class_var = "I am class variable" # সব ইনস্ট্যান্স শেয়ার করে
def __init__(self, val):
self.instance_var = val # প্রতিটি ইনস্ট্যান্সের আলাদা
def show(self):
print(f"Class: {self.class_var}, Instance: {self.instance_var}")
obj1 = MyClass("First")
obj2 = MyClass("Second")
obj1.show() # Class: I am class variable, Instance: First
obj2.show() # Class: I am class variable, Instance: Second
# ক্লাস ভেরিয়েবল পরিবর্তন
MyClass.class_var = "Changed"
obj1.show() # Class: Changed, Instance: First
obj2.show() # Class: Changed, Instance: Second
সারসংক্ষেপ টেবিল
| ভেরিয়েবল টাইপ | স্কোপ | লাইফটাইম | অ্যাক্সেস |
|---|---|---|---|
| গ্লোবাল (মডিউল লেভেল) | পুরো মডিউল | প্রোগ্রাম চলার পর্যন্ত | যেকোনো জায়গা থেকে |
| ক্লাস ভেরিয়েবল | ক্লাস এবং ইনস্ট্যান্স | ক্লাস লোড হওয়ার থেকে | ClassName.var বা self.var |
ইনস্ট্যান্স ভেরিয়েবল (self.x) | নির্দিষ্ট ইনস্ট্যান্স | ইনস্ট্যান্স লাইফটাইম | self.var দিয়ে মেথডে |
| লোকাল ভেরিয়েবল (মেথডে) | শুধু সেই মেথড | মেথড এক্সিকিউশন পর্যন্ত | শুধু সেই মেথডের ভিতরে |
সেরা অনুশীলন: গ্লোবাল ভেরিয়েবল কম से কম ব্যবহার করুন। ক্লাস ভেরিয়েবল শুধু কনস্ট্যান্ট বা শেয়ার্ড স্টেটের জন্য ব্যবহার করুন। ইনস্ট্যান্স ডেটার জন্য সবসময়
self.x ব্যবহার করুন।