2013-02-28 4 views
6

नीचे दिए गए उदाहरण में, विशेषता x वस्तु के स्लॉट से पहुँचा जा सकता है भले ही x__dict__ में मौजूद है (यह एक ठेठ या शायद उपयोगी मामला नहीं है, लेकिन मैं उत्सुक हूँ) है:पायथन में विशेषता का उपयोग: पहला स्लॉट, फिर __dict__?

>>> class C(object): 
...  __slots__ = 'x' 
...  
>>> class D(C): 
...  pass 
... 
>>> obj = D() 
>>> obj.x = 'Stored in slots' 
>>> obj.__dict__ 
{} 
>>> obj.__dict__['x'] = 'stored in __dict__' 
>>> obj.x 
'Stored in slots' 

है पहुंच का यह आदेश (पहले स्लॉट) एक दस्तावेजी व्यवहार? या बस एक कार्यान्वयन विस्तार?

उत्तर

10

हां, किसी ऑब्जेक्ट की __dict__ केवल डेटा डिस्क्रिप्टर से परामर्श के बाद परामर्श किया जाता है। __slots__ विशेषताएँ डेटा डिस्क्रिप्टर के रूप में लागू की जाती हैं।

Invoking descriptors देखें:

उदाहरण बाइंडिंग के लिए, वर्णनकर्ता मंगलाचरण के पूर्वता जो वर्णनकर्ता तरीकों परिभाषित कर रहे हैं पर निर्भर करता है। एक वर्णनकर्ता __get__(), __set__() और __delete__() के किसी भी संयोजन को परिभाषित कर सकता है। यदि यह __get__() को परिभाषित नहीं करता है, तो विशेषता तक पहुंचने से ऑब्जेक्टर्स ऑब्जेक्ट को तब तक वापस कर दिया जाएगा जब तक ऑब्जेक्ट के इंस्टेंस डिक्शनरी में कोई मान न हो। यदि वर्णनकर्ता __set__() और/या __delete__() परिभाषित करता है, तो यह एक डेटा वर्णनकर्ता है; यदि यह न तो परिभाषित करता है, तो यह एक गैर-डेटा वर्णनकर्ता है। आम तौर पर, डेटा डिस्क्रिप्टर __get__() और __set__() दोनों को परिभाषित करते हैं, जबकि गैर-डेटा वर्णनकर्ताओं के पास केवल __get__() विधि होती है। __set__() और __get__() के साथ डेटा डिस्क्रिप्टर हमेशा एक आवृत्ति शब्दकोश में एक पुनर्वितरण को ओवरराइड करते हैं। इसके विपरीत, गैर-डेटा वर्णनकर्ताओं को उदाहरणों से ओवरराइड किया जा सकता है।

और एक ही पृष्ठ से, section on slots:

__slots__ प्रत्येक चर नाम के लिए वर्णनकर्ता (कार्यान्वयन वर्णनकर्ता) बनाने के द्वारा श्रेणी स्तर पर लागू किया जाता है। नतीजतन, कक्षा गुणों का उपयोग __slots__ द्वारा परिभाषित उदाहरण चर के लिए डिफ़ॉल्ट मान सेट करने के लिए नहीं किया जा सकता है; अन्यथा, वर्ग विशेषता वर्णनकर्ता असाइनमेंट को ओवरराइट कर देगी।

+0

मेरा मानना ​​है कि इसे उद्धृत किया जाना चाहिए ([वर्णनकर्ताओं को कार्यान्वित करना] से [http://docs.python.org/2/reference/datamodel.html#implementing-descriptors)): "वर्णनकर्ता या तो होना चाहिए मालिक के वर्ग शब्दकोश या अपने माता-पिता के लिए कक्षा शब्दकोश में "। –

+1

@PavelAnossov: सुनिश्चित नहीं है कि स्लॉट को समझने के लिए क्या जोड़ा जाएगा। स्लॉट विशेषताओं को वर्ग पर वर्णक के रूप में लागू किया जाता है, और डेटा वर्णनकर्ता उदाहरण के पहले '__dict__' मान आते हैं। यह व्यवहार करने के लिए पर्याप्त है, है ना? –

+0

@PavelAnossov: हां, कभी-कभी लोग इस बात से उलझन में हैं कि वर्णनकर्ताओं को कहाँ देखा जाता है, लेकिन यह यहां पर नहीं है। –

संबंधित मुद्दे