কেন আমরা @property ব্যবহার করি?
@property মূলত তখনই ব্যবহার করা হয় যখন তুমি একটি ক্লাসের প্রাইভেট ডেটা ম্যানিপুলেট করতে চাও, কিন্তু চাও না যে ব্যবহারকারীরা সরাসরি ডেটাগুলোর সাথে কাজ করুক। এটি গেটার (ডেটা পড়ার জন্য), সেটার (ডেটা পরিবর্তন করার জন্য), এবং ডিলিটার (ডেটা মুছে ফেলার জন্য) ব্যবহার করে ডেটা এনক্যাপসুলেশন করার সুবিধা দেয়।
যদি @property ব্যবহার না করো তাহলে কী হবে?
@property ব্যবহার না করলে, ডেটাগুলোর উপর সরাসরি অ্যাক্সেস থাকবে। ধরো তুমি কোনো ডেটা সরাসরি চেঞ্জ করতে চাচ্ছো, তাহলে কোডে অসাবধানতায় ভুল কিছু মান সেট হতে পারে।
অন্যদিকে, @property ব্যবহারে তুমি সেটার (setter) এর মাধ্যমে ডেটা কন্ট্রোল করতে পারো, যেমন ডেটার জন্য একটি বিশেষ শর্ত রাখতে পারো। এতে ডেটা ভুলভাবে পরিবর্তন হওয়া রোধ করা যায়।
সহজ উদাহরণ (রিয়েল লাইফ প্রবলেম):
ধরো, তোমার একটি ব্যাংক অ্যাকাউন্ট আছে। আমরা চাই কেউ সরাসরি অ্যাকাউন্টের ব্যালেন্স পরিবর্তন করতে না পারে, যেমন ভুলভাবে ব্যালেন্স সেট করা বা নেগেটিভ মান দেওয়া। তাই আমরা @property ব্যবহার করবো যাতে নিরাপদ উপায়ে ব্যালেন্স ম্যানিপুলেট করা যায়।
@property না ব্যবহার করলে:
class BankAccount:
def __init__(self, balance):
self.balance = balance
# অ্যাকাউন্ট তৈরি
account = BankAccount(1000)
# সরাসরি ব্যালেন্স পরিবর্তন করা হচ্ছে (ভুলভাবে)
account.balance = -500 # এটি কোনো সমস্যা ছাড়াই হবে, যা ভুল।
print(account.balance) # Output: -500
এখানে আমরা দেখতে পাচ্ছি, কেউ সহজেই ভুল করে নেগেটিভ ব্যালেন্স সেট করতে পারছে। যা বাস্তব জীবনে ভুল।
@property ব্যবহার করলে:
class BankAccount:
def __init__(self, balance):
self._balance = balance # প্রাইভেট ভেরিয়েবল
# গেটার: balance এর মান পাওয়ার জন্য
@property
def balance(self):
return self._balance
# সেটার: ব্যালেন্স সেট করার সময় শর্ত চেক করা
@balance.setter
def balance(self, amount):
if amount >= 0:
self._balance = amount
else:
raise ValueError("Balance cannot be negative!")
# অ্যাকাউন্ট তৈরি
account = BankAccount(1000)
# ব্যালেন্স সেট করার চেষ্টা (ভুল মান)
try:
account.balance = -500 # এবার এটি কাজ করবে না
except ValueError as e:
print(e) # Output: Balance cannot be negative!
# সঠিকভাবে ব্যালেন্স সেট করা
account.balance = 1500
print(account.balance) # Output: 1500
কী হলো এখানে?
- প্রাইভেট ভেরিয়েবল: আমরা
_balanceনামে একটি প্রাইভেট ভেরিয়েবল ব্যবহার করেছি, যাতে কেউ সরাসরি এটি অ্যাক্সেস করতে না পারে। - গেটার:
@propertyডেকোরেটর ব্যবহার করে একটি গেটার মেথড তৈরি করা হয়েছে, যাতে আমরা সহজেইaccount.balanceএর মাধ্যমে ব্যালেন্স পড়তে পারি। - সেটার:
@balance.setterডেকোরেটরের মাধ্যমে একটি সেটার তৈরি করা হয়েছে, যেখানে আমরা ব্যালেন্স সেট করার সময় শর্ত দিয়েছি যে ব্যালেন্স কখনোই নেগেটিভ হতে পারবে না। যদি কেউ নেগেটিভ মান সেট করতে চায়, তাহলে সেটি কাজ করবে না এবংValueErrorপ্রদর্শন করবে।
কেন এই পদ্ধতি ভালো?
- ডেটা সুরক্ষিত রাখা: কেউ সরাসরি ডেটা পরিবর্তন করতে পারবে না।
- ইনপুট ভ্যালিডেশন: আমরা শর্ত (validation) যোগ করতে পারি, যেমন ব্যালেন্স নেগেটিভ না হওয়ার নিয়ম।
- এনক্যাপসুলেশন: এটি প্রাইভেট ভেরিয়েবলকে কন্ট্রোল্ড উপায়ে ম্যানিপুলেট করার একটি ভালো উপায়।
এখন, তুমি সহজেই বুঝতে পারছো যে @property ডেকোরেটর ব্যবহার করলে, ডেটা ম্যানিপুলেশন নিরাপদ হয় এবং ভুলের সম্ভাবনা কমে যায়।