এটি লক্ষণীয় যে প্রশ্নে নির্দিষ্ট সমস্যাটির জন্য ব্যবহারের বিভিন্ন বিকল্প রয়েছে eval
:
সরল, যেমনটি উল্লেখ করা হয়েছে, তা ব্যবহার করছে setattr
:
def __init__(self):
for name in attsToStore:
setattr(self, name, None)
একটি কম স্পষ্ট পদ্ধতির অবজেক্টের __dict__
অবজেক্টটি সরাসরি আপডেট করা ating আপনি যদি যা করতে চান তার মধ্যে বৈশিষ্ট্যগুলি আরম্ভ করা হয় None
, তবে এটি উপরের চেয়ে কম সোজা। তবে এটি বিবেচনা করুন:
def __init__(self, **kwargs):
for name in self.attsToStore:
self.__dict__[name] = kwargs.get(name, None)
এটি আপনাকে নির্মাণকারীর কাছে কী-ওয়ার্ড আর্গুমেন্টগুলি পাস করার অনুমতি দেয়, যেমন:
s = Song(name='History', artist='The Verve')
এটি আপনাকে locals()
আরও স্পষ্টভাবে আপনার ব্যবহার করতে দেয় যেমন:
s = Song(**locals())
... এবং, যদি আপনি সত্যিই None
সেই বৈশিষ্ট্যগুলিকে নির্দিষ্ট করতে চান তবে যার নাম পাওয়া যায় locals()
:
s = Song(**dict([(k, None) for k in locals().keys()]))
বৈশিষ্ট্যের তালিকার জন্য ডিফল্ট মান সহ কোনও বস্তু সরবরাহের জন্য আরেকটি পদ্ধতির শ্রেণীর __getattr__
পদ্ধতিটি সংজ্ঞা দেওয়া:
def __getattr__(self, name):
if name in self.attsToStore:
return None
raise NameError, name
যখন নামযুক্ত বৈশিষ্ট্যটি সাধারণ উপায়ে পাওয়া যায় না তখন এই পদ্ধতিটি কল হয়। এই পদ্ধতির সাথে কন্সট্রাক্টরের বৈশিষ্ট্যগুলি সেট করা বা আপডেট করার চেয়ে কিছুটা সহজ সরল __dict__
, তবে এটি উপস্থিতি না থাকলে প্রকৃতপক্ষে বৈশিষ্ট্যটি তৈরি না করার যোগ্যতা রয়েছে যা শ্রেণীর স্মৃতি ব্যবহারকে যথেষ্ট পরিমাণে হ্রাস করতে পারে।
এই সমস্ত বিষয়: সাধারণত এড়ানোর জন্য প্রচুর কারণ রয়েছে eval
- আপনি যে কোডটি নিয়ন্ত্রণ করেন না তা কার্যকর করার কোডের সুরক্ষা সমস্যা, কোডটির ব্যবহারিক সমস্যা যা আপনি ডিবাগ করতে পারবেন না ইত্যাদি etc. তবে আরও গুরুত্বপূর্ণ কারণ But এটি সাধারণভাবে, আপনার এটি ব্যবহার করার দরকার নেই। পাইথন এর অভ্যন্তরীণ প্রক্রিয়াগুলির প্রচুর পরিমাণ প্রোগ্রামারকে প্রকাশ করে যে আপনার কোডটি লিখতে খুব কমই প্রয়োজন।
exec/eval
এবং এখনও জানেন নাsetattr
?