প্রথমত A.__dict__.__dict__
পৃথক পৃথক A.__dict__['__dict__']
, এবং পূর্বের অস্তিত্ব নেই। পরেরটি হচ্ছে __dict__
শ্রেণীর উদাহরণগুলির মধ্যে থাকা বৈশিষ্ট্যটি। এটি একটি বর্ণনাকারী অবজেক্ট যা নির্দিষ্ট উদাহরণের জন্য বৈশিষ্ট্যের অভ্যন্তরীণ অভিধানটি ফিরিয়ে দেয়। সংক্ষেপে, __dict__
কোনও বস্তুর বৈশিষ্ট্য অবজেক্টের মধ্যে সংরক্ষণ করা যায় না __dict__
, সুতরাং এটি ক্লাসে সংজ্ঞায়িত বিবরণীর মাধ্যমে অ্যাক্সেস করা যায়।
এটি বুঝতে, আপনাকে বিবরণী প্রোটোকলের ডকুমেন্টেশন পড়তে হবে ।
সংক্ষিপ্ত সংস্করণ:
- শ্রেণীর উদাহরণের জন্য
A
, অ্যাক্সেস দেওয়া instance.__dict__
হয় যার দ্বারা A.__dict__['__dict__']
একই vars(A)['__dict__']
।
- ক্লাস এ এর জন্য, অ্যাক্সেস
A.__dict__
সরবরাহ করা হয় type.__dict__['__dict__']
(তত্ত্ব অনুসারে) যা একই vars(type)['__dict__']
।
দীর্ঘ সংস্করণ:
উভয় শ্রেণি এবং অবজেক্ট অ্যাট্রিবিউট অপারেটর (ক্লাস বা মেটাক্লাস এর মাধ্যমে প্রয়োগ করা হয় __getattribute__
), এবং __dict__
দ্বারা ব্যবহৃত বৈশিষ্ট্য / প্রোটোকলের মাধ্যমে উভয় বৈশিষ্ট্যে অ্যাক্সেস সরবরাহ করে vars(ob)
।
সাধারণ অবজেক্টের জন্য, __dict__
অবজেক্টটি একটি পৃথক অবজেক্ট তৈরি করে dict
, যা বৈশিষ্ট্যগুলি সংরক্ষণ করে এবং __getattribute__
প্রথমে এটি অ্যাক্সেস করার এবং সেখান থেকে বৈশিষ্ট্যগুলি পাওয়ার চেষ্টা করে (বর্ণনামূলক প্রোটোকলটি ব্যবহার করে শ্রেণিতে বৈশিষ্ট্যটি অনুসন্ধান করার আগে এবং কল করার আগে __getattr__
)। __dict__
শ্রেণীর বর্ণনাকারী এই অভিধানটিতে অ্যাক্সেস প্রয়োগ করে।
x.name
অনুক্রমে সেই চেষ্টা সমতূল্য: x.__dict__['name']
, type(x).name.__get__(x, type(x))
,type(x).name
x.__dict__
একই কাজ করে তবে সুস্পষ্ট কারণে প্রথমটিকে এড়িয়ে যায়
এটির জন্য অসম্ভব হিসেবে __dict__
এর instance
সংরক্ষণ করার জন্য __dict__
উদাহরণস্বরূপ, এটি বর্ণনাকারী প্রোটোকল মাধ্যমে সরাসরি পরিবর্তে অ্যাক্সেস করা হয়, এবং উদাহরণ হিসেবে বলা যায় একটি বিশেষ ক্ষেত্র মধ্যে সংরক্ষিত হয়।
ক্লাসগুলির জন্য একই জাতীয় দৃশ্য সত্য, যদিও __dict__
এগুলি একটি বিশেষ প্রক্সি অবজেক্ট যা অভিধান হিসাবে ভান করে (তবে অভ্যন্তরীণভাবে এটি হতে পারে না), এবং আপনাকে এটি পরিবর্তন করতে বা এটি অন্য কোনওটির সাথে প্রতিস্থাপন করতে দেয় না। এই প্রক্সি আপনাকে অন্য সকলের মধ্যেও নির্দিষ্ট শ্রেণীর বৈশিষ্ট্যগুলি অ্যাক্সেস করার অনুমতি দেয় এবং এর কোনও বেসে সংজ্ঞায়িত করা হয় না।
ডিফল্টরূপে, একটি vars(cls)
খালি শ্রেণীর মধ্যে তিনটি বর্ণনাকারী বহন করে - __dict__
উদাহরণগুলির বৈশিষ্ট্যগুলি সংরক্ষণের জন্য, __weakref__
যা অভ্যন্তরীণভাবে ব্যবহৃত হয় weakref
এবং শ্রেণীর ডক্ট্রিং। আপনি সংজ্ঞা দিলে প্রথম দুটি চলে যেতে পারে __slots__
। তারপর আপনি হবে না __dict__
এবং __weakref__
বৈশিষ্ট্যাবলী, কিন্তু এর পরিবর্তে আপনি প্রতিটি স্লটে জন্য একটি একক বর্গ অ্যাট্রিবিউট আছে চাই। উদাহরণস্বরূপের বৈশিষ্ট্যগুলি তখন কোনও অভিধানে সংরক্ষণ করা হবে না এবং এগুলিতে অ্যাক্সেস ক্লাসে সংশ্লিষ্ট বর্ণনাকারীদের দ্বারা সরবরাহ করা হবে।
এবং সর্বশেষে, অসঙ্গতি যে A.__dict__
থেকে ভিন্ন A.__dict__['__dict__']
কারণ অ্যাট্রিবিউট __dict__
হয়, ব্যতিক্রম দ্বারা, কখনো আপে লাগছিল vars(A)
, তাই কি এটা জন্য সত্য কার্যকরীভাবে অন্য কোন বৈশিষ্ট্য আপনি ব্যবহার করতে চাই জন্য সত্য নয়। উদাহরণস্বরূপ, A.__weakref__
হিসাবে একই জিনিস A.__dict__['__weakref__']
। যদি এই অসঙ্গতিটি না থাকে তবে ব্যবহার করা কার্যকর A.__dict__
হবে না এবং vars(A)
পরিবর্তে আপনাকে সর্বদা ব্যবহার করতে হবে।
ive
। কমপক্ষে এটি আরও একটিA.__dict__['ive']
প্রশ্ন করে তুলেছে;) আমি নিজেকে দেখব