পাইথনে সবকিছু অবজেক্ট, ফাংশনও অবজেক্ট। তাই ফাংশনের অ্যাট্রিবিউট থাকতে পারে এবং ডাইনামিক্যালি যোগ/পড়া/মডিফাই করা যায়।
বিল্ট-ইন অ্যাট্রিবিউট
__name__— ফাংশন নাম__doc__— ডকস্ট্রিং__module__— মডিউল নাম__annotations__— টাইপ হিন্ট__code__— কোড অবজেক্ট (বাইটকোড, কনস্ট্যান্ট, ভেরিয়েবল নাম)__defaults__— ডিফল্ট আর্গামেন্ট ভ্যালু টাপল__kwdefaults__— কিওয়ার্ড-অনলি ডিফল্ট__closure__— ক্লোজার সেল টাপল (যদি থাকে)__dict__— ইউজার-ডিফাইনড অ্যাট্রিবিউট সংরক্ষণ
অ্যাট্রিবিউট সেট/গেট
def foo():
pass
# ডট নোটেশন
foo.age = 23
foo.name = "John Doe"
# setattr/getattr
setattr(foo, 'gender', 'male')
print(getattr(foo, 'age')) # 23
print(foo.gender) # male
print(foo.name) # John Doe
print(foo.age) # 23
ব্যবহার ক্ষেত্র
- মেটাডেটা সংরক্ষণ (ভের্সন, লেখক, ডিপ্রিকেশন নোট)
- রানটাইম কনফিগারেশন
- ডেকোরেটর স্টেট ট্র্যাকিং
- টেস্টিং/মকিং টুলে ফাংশন ট্যাগিং
সতর্কতা
ফাংশন অ্যাট্রিবিউট মিউটেবল, তাই শেয়ার্ড রেফারেন্সের মাধ্যমে অপ্রত্যাশিত পরিবর্তন হতে পারে। ক্লাস বা ডেটা ক্লাস ব্যবহার করলে আরও ক্লিন থাকে।