একটি সংক্ষিপ্ত উত্তর: ব্যবহার proxy_tools
proxy_tools
প্যাকেজ প্রচেষ্টা প্রদান@module_property
কার্যকারিতা।
এটি দিয়ে ইনস্টল
pip install proxy_tools
@ ম্যারেইনের উদাহরণের সামান্য পরিবর্তন ব্যবহার করে, the_module.py
আমরা
লিখেছি
from proxy_tools import module_property
@module_property
def thing():
print(". ", end='')
return 'hello'
এখন অন্য স্ক্রিপ্ট থেকে, আমি করতে পারেন
import the_module
print(the_module.thing)
অপ্রত্যাশিত আচরণ
এই সমাধানটি সতর্কতা ছাড়াই নয়। যেমন, the_module.thing
হয় একটি স্ট্রিং না ! এটি এমন একটি proxy_tools.Proxy
বস্তু যার বিশেষ পদ্ধতিগুলি ওভাররাইড করা হয়েছে যাতে এটি একটি স্ট্রিং নকল করে। এখানে কয়েকটি বুনিয়াদি পরীক্ষাগুলি রয়েছে যা দৃষ্টান্তটি তুলে ধরে:
res = the_module.thing
print(type(res))
print(isinstance(res, str))
print(res)
print(res + " there")
print(isinstance(res + "", str))
print(res.split('e'))
অভ্যন্তরীণভাবে, মূল ফাংশন এতে সংরক্ষণ করা হয় the_module.thing._Proxy__local
:
print(res._Proxy__local)
আরও চিন্তা
সত্যি বলতে আমি কেন মডিউল এই কার্যকারিতা সালে নির্মিত হবে না হতবুদ্ধি করছি। আমি মনে করি বিষয়ের মূল অংশ যে the_module
একটি দৃষ্টান্ত হল types.ModuleType
বর্গ। একটি "মডিউল সম্পত্তি" সেট করা শ্রেণীর নিজের চেয়ে বরং এই শ্রেণীর উদাহরণে সম্পত্তি সেট করার সমান types.ModuleType
। আরও বিশদের জন্য এই উত্তরটি দেখুন ।
types.ModuleType
ফলাফলগুলি দুর্দান্ত না হলেও আমরা প্রকৃতপক্ষে নিম্নরূপে বৈশিষ্ট্যগুলি প্রয়োগ করতে পারি । আমরা অন্তর্নির্মিত প্রকারগুলিকে সরাসরি সংশোধন করতে পারি না, তবে আমরা তাদের অভিশাপ দিতে পারি:
from forbiddenfruit import curse
from types import ModuleType
curse(ModuleType, "thing2", property(lambda module: f'hi from {module.__name__}'))
এটি আমাদের একটি সম্পত্তি দেয় যা সমস্ত মডিউলগুলির মধ্যে বিদ্যমান। এটি কিছুটা অপ্রয়োজনীয়ভাবে, যেহেতু আমরা সমস্ত মডিউল জুড়ে সেটিং আচরণটি ভাঙ্গি:
import sys
print(sys.thing2)
sys.thing2 = 5
__getattr__
একটি মডিউল দেখুন ।