পাইথন সাজসজ্জা দিয়ে শুরু করা যাক।
পাইথন ডেকরেটার এমন একটি ফাংশন যা ইতিমধ্যে সংজ্ঞায়িত ফাংশনে কিছু অতিরিক্ত কার্যকারিতা যুক্ত করতে সহায়তা করে।
পাইথনে, সমস্ত কিছুই একটি বস্তু। পাইথনে ফাংশন হ'ল প্রথম-শ্রেণীর অবজেক্টস যার অর্থ তারা ভেরিয়েবলের মাধ্যমে রেফারেন্স করতে পারে, তালিকাগুলিতে যোগ করা যায়, অন্য ফাংশনে আর্গুমেন্ট হিসাবে পাস করা হয় ইত্যাদি that
নিম্নলিখিত কোড স্নিপেট বিবেচনা করুন।
def decorator_func(fun):
def wrapper_func():
print("Wrapper function started")
fun()
print("Given function decorated")
# Wrapper function add something to the passed function and decorator
# returns the wrapper function
return wrapper_func
def say_bye():
print("bye!!")
say_bye = decorator_func(say_bye)
say_bye()
# Output:
# Wrapper function started
# bye
# Given function decorated
এখানে, আমরা বলতে পারি যে ডেকোরেটর ফাংশনটি আমাদের বলে_হেলো ফাংশনটি সংশোধন করেছে এবং এতে কোডের অতিরিক্ত কিছু লাইন যুক্ত করেছে।
সাজসজ্জার জন্য পাইথন সিনট্যাক্স
def decorator_func(fun):
def wrapper_func():
print("Wrapper function started")
fun()
print("Given function decorated")
# Wrapper function add something to the passed function and decorator
# returns the wrapper function
return wrapper_func
@decorator_func
def say_bye():
print("bye!!")
say_bye()
আসুন একটি কেস দৃশ্যের চেয়ে সবকিছু শেষ করা যাক, তবে এর আগে কিছু উফ প্রিন্সিপাল সম্পর্কে কথা বলা যাক।
ডেটা এনক্যাপসুলেশনের মূলনীতিটি নিশ্চিত করার জন্য অনেকগুলি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ল্যাঙ্গুয়েজে গেটার এবং সেটটার ব্যবহার করা হয় (এই ডেটাগুলিতে পরিচালিত পদ্ধতিগুলির সাথে ডেটা বান্ডিলিং হিসাবে দেখা হয়))
এই পদ্ধতিগুলি অবশ্যই ডেটা পুনরুদ্ধারের জন্য প্রাপ্তি এবং ডেটা পরিবর্তনের জন্য সেটার।
এই নীতি অনুসারে, কোনও শ্রেণীর বৈশিষ্ট্যগুলি গোপনীয়তা এবং অন্য কোড থেকে তাদের সুরক্ষার জন্য ব্যক্তিগত করা হয়।
হ্যাঁ, @ প্রপার্টি মূলত গেটরস এবং সিটারগুলি ব্যবহার করার এক অজগর উপায়।
পাইথনের সম্পত্তি হিসাবে একটি দুর্দান্ত ধারণা রয়েছে যা কোনও অবজেক্ট ভিত্তিক প্রোগ্রামারটির জীবনকে আরও সহজ করে তোলে।
আমাদের ধরে নেওয়া যাক আপনি এমন একটি ক্লাস তৈরি করার সিদ্ধান্ত নিয়েছেন যা তাপমাত্রা ডিগ্রি সেলসিয়াসে সঞ্চয় করতে পারে।
class Celsius:
def __init__(self, temperature = 0):
self.set_temperature(temperature)
def to_fahrenheit(self):
return (self.get_temperature() * 1.8) + 32
def get_temperature(self):
return self._temperature
def set_temperature(self, value):
if value < -273:
raise ValueError("Temperature below -273 is not possible")
self._temperature = value
রিফ্যাক্টর কোড, এখানে আমরা কীভাবে সম্পত্তি সহ এটি অর্জন করতে পারতাম।
পাইথনে, সম্পত্তি () হ'ল একটি অন্তর্নির্মিত ফাংশন যা কোনও সম্পত্তি বস্তু তৈরি করে এবং প্রদান করে।
একটি সম্পত্তি বস্তুর তিনটি পদ্ধতি রয়েছে, গেটর (), সেটার () এবং মুছুন ()।
class Celsius:
def __init__(self, temperature = 0):
self.temperature = temperature
def to_fahrenheit(self):
return (self.temperature * 1.8) + 32
def get_temperature(self):
print("Getting value")
return self.temperature
def set_temperature(self, value):
if value < -273:
raise ValueError("Temperature below -273 is not possible")
print("Setting value")
self.temperature = value
temperature = property(get_temperature,set_temperature)
এখানে,
temperature = property(get_temperature,set_temperature)
হিসাবে ভেঙে যেতে পারে,
# make empty property
temperature = property()
# assign fget
temperature = temperature.getter(get_temperature)
# assign fset
temperature = temperature.setter(set_temperature)
লক্ষ করার বিষয়:
- get_tempe साहित्य একটি পদ্ধতির পরিবর্তে সম্পত্তি হিসাবে রয়ে গেছে।
এখন আপনি লিখে তাপমাত্রার মান অ্যাক্সেস করতে পারেন।
C = Celsius()
C.temperature
# instead of writing C.get_temperature()
আমরা আরও এগিয়ে যেতে পারি এবং নামগুলি get_temperature এবং set_temperature সংজ্ঞায়িত করতে পারি না কারণ এগুলি অপ্রয়োজনীয় এবং শ্রেণীর নেমস্পেসকে দূষিত করে।
Pythonic পথ উপরে সমস্যা মোকাবেলা করতে ব্যবহার করা @property ।
class Celsius:
def __init__(self, temperature = 0):
self.temperature = temperature
def to_fahrenheit(self):
return (self.temperature * 1.8) + 32
@property
def temperature(self):
print("Getting value")
return self.temperature
@temperature.setter
def temperature(self, value):
if value < -273:
raise ValueError("Temperature below -273 is not possible")
print("Setting value")
self.temperature = value
লক্ষ করার পয়েন্টগুলি -
- একটি মান যা মান পাওয়ার জন্য ব্যবহৃত হয় তা "@ প্রপার্টি" দিয়ে সজ্জিত।
- সেটার হিসাবে যে পদ্ধতিটি কাজ করতে হবে তাকে "@ তাপমাত্রা.সেটর" দিয়ে সজ্জিত করা হয়েছে, যদি ফাংশনটি "এক্স" বলা হত, তবে আমরা এটি "@ x.setter" দিয়ে সাজাইয়া দিতে পারি।
- আমরা একই নাম এবং "ডিএফ তাপমাত্রা (স্ব)" এবং "ডিএফ তাপমাত্রা (স্ব, এক্স)" দিয়ে বিভিন্ন সংখ্যক পরামিতি সহ "দুটি" পদ্ধতি লিখেছি।
আপনি দেখতে পাচ্ছেন যে কোডটি অবশ্যই কম মার্জিত।
এখন, আসুন একটি বাস্তব জীবনের ব্যবহারিক দৃশ্যের কথা বলি।
ধরা যাক আপনি নিম্নলিখিত হিসাবে একটি ক্লাস ডিজাইন করেছেন:
class OurClass:
def __init__(self, a):
self.x = a
y = OurClass(10)
print(y.x)
এখন, আরও ধরে নেওয়া যাক যে ক্লাস ক্লায়েন্টদের মধ্যে জনপ্রিয় হয়ে উঠেছে এবং তারা তাদের প্রোগ্রামগুলিতে এটি ব্যবহার শুরু করে, তারা বস্তুটিতে সমস্ত ধরণের অ্যাসাইনমেন্ট দেয়।
এবং এক দুর্ভাগ্যজনক দিনে, একজন বিশ্বস্ত ক্লায়েন্ট আমাদের কাছে এসে পরামর্শ দিলেন যে "x" এর মান 0 এবং 1000 এর মধ্যে হওয়া উচিত, এটি সত্যিই এক ভয়াবহ দৃশ্য!
বৈশিষ্ট্যগুলির কারণে এটি সহজ: আমরা "x" এর একটি সম্পত্তি সংস্করণ তৈরি করি।
class OurClass:
def __init__(self,x):
self.x = x
@property
def x(self):
return self.__x
@x.setter
def x(self, x):
if x < 0:
self.__x = 0
elif x > 1000:
self.__x = 1000
else:
self.__x = x
এটি দুর্দান্ত, তাই না: আপনি কল্পনাযোগ্যতম সহজ বাস্তবায়ন দিয়ে শুরু করতে পারেন এবং ইন্টারফেসটি পরিবর্তন না করেই আপনি কোনও সম্পত্তি সংস্করণে মাইগ্রেট করতে পারেন! সুতরাং সম্পত্তিগুলি কেবল গেটার এবং সেটারের প্রতিস্থাপন নয়!
আপনি এখানে এই বাস্তবায়ন পরীক্ষা করতে পারেন