পাইথনে সবকিছু অবজেক্ট। প্রতিটি অবজেক্টের অ্যাট্রিবিউট (ডেটা ভেরিয়েবল) এবং মেথড (ফাংশন) থাকতে পারে। প্রপার্টি হলো একটি স্পেশাল ধরনের অ্যাট্রিবিউট যাতে গেটার, সেটার, ডিলিটার মেথড থাকে।
অ্যাট্রিবিউট vs প্রপার্টি
| অ্যাট্রিবিউট | প্রপার্টি |
|---|---|
| সাধারণ ডেটা ভেরিয়েবল (name, age, height) | গেটার/সেটার/ডিলিটার মেথড সহ 스페셜 অ্যাট্রিবিউট |
সিয়रा এক্সেস: obj.attr | এক্সেস সময় __get__, সেট সময় __set__, ডিলিট সময় __delete__ কল হয় |
| ভ্যালিডেশন/লজিক যোগ করা যায় না | এক্সেস/মডিফিকেশন সময় লজিক রান করা যায় |
@property ডেকোরেটর ব্যবহার
class C:
def __init__(self):
self._x = None # প্রাইভেট অ্যাট্রিবিউট (কনভেনশন)
@property
def x(self):
"""I'm the 'x' property."""
return self._x # গেটার
@x.setter
def x(self, value):
self._x = value # সেটার
@x.deleter
def x(self):
del self._x # ডিলিটার
obj = C()
obj.x = 10 # সেটার কল হয়
print(obj.x) # গেটার কল হয় → 10
del obj.x # ডিলিটার কল হয়
মূল পার্থক্য
যখন foo.bar এক্সেস করা হয়, পাইথন bar-কে খুঁজে বের করে। যদি bar-এর __get__, __set__, বা __delete__ মেথড থাকে, তবে এটি একটি প্রপার্টি (ডেসক্রিপ্টর প্রোটোকল)। তখন সাধারণ ভ্যালু রিটার্ন না করে সংশ্লিষ্ট মেথড কল হয়।