यह dict के माध्यम से पाशन और del
उन्हें eting से अलग तरीके से व्यवहार करता है?
यह यहाँ है कि किसी भी कस्टम MutableMapping
सार आधार वर्ग को लागू करने वर्ग clear()
एक "मुक्त" mixin पद्धति के रूप में हो जाता है ध्यान देने योग्य है।
केवल तरीकों आप एक MutableMapping
उपवर्ग का दृष्टांत में ओवरराइड करने के लिए की जरूरत है:
__getitem__, __setitem__, __delitem__, __iter__, __len__
के बाद से आप अपनी पसंद के किसी भी तरह से अपने मानचित्रण कक्षा में डेटा स्टोर कर सकते हैं, एक ही रास्ता clear()
यह पता लगाने कैसे कर सकते हैं वास्तव में अपने डेटा को साफ़ करने के लिए उन पांच तरीकों में से एक या अधिक का उपयोग कर है। अब, आपको लगता है कि clear()
किस तरीके का उपयोग कर रहा है, लेकिन अनुमान लगाया जा सकता है कि हम प्रयोग कर सकते हैं?
import collections
class MyMap(collections.MutableMapping):
def __init__(self, mydict):
self._top_secret_data = mydict
def __getitem__(self, key):
print 'getitem'
return self._top_secret_data[key]
def __setitem__(self, key, value):
raise Exception('where did you want that?')
def __len__(self):
raise Exception('a gentleman never tells')
def __delitem__(self, key):
print '[shredding intensifies]'
del self._top_secret_data[key]
def __iter__(self):
def keygen():
for key in self._top_secret_data:
print 'faster! faster!'
yield key
return iter(keygen())
वर्ग ऊपर परिभाषित का उपयोग करना, यह देखने के लिए clear()
कैसे कार्यान्वित किया जाता है आसान है:
>>> m = MyMap({1:'a', 2:'b', 3:'c'})
>>> m.clear()
faster! faster!
getitem
[shredding intensifies]
faster! faster!
getitem
[shredding intensifies]
faster! faster!
getitem
[shredding intensifies]
>>>
दूसरे शब्दों में, clear()
mixin विधि मूल रूप से for key in self: del self[key]
के रूप में कार्यान्वित किया जाता है।
अब, एक अस्वीकरण: dict
जैसे अंतर्निहित प्रकार सी में लागू किए गए हैं, इसलिए dict.clear
विधि सचमुच for key in mydict: del mydict[key]
के समान नहीं हो सकती है। मैं दृश्यों के पीछे कुछ अनुकूलन की अपेक्षा करता हूं, शायद एक पूरी तरह से अलग रणनीति - लेकिन उम्मीद है कि यह उदाहरण आपको clear()
पायथन में काम करने की विधि के बारे में कुछ विचार देता है।
दूसरे शब्दों में, यदि कुंजी या मान साझा किए जाते हैं (किसी अन्य चर को सौंपा गया), तो उनकी ऑब्जेक्ट्स को हटाया नहीं जाएगा और न ही 'd.clear()', और न ही 'del d [ कुंजी] '। एक कुंजीपटल स्टोर दोनों कुंजी और मूल्यों के संदर्भ। ऑपरेशन द्वारा * संदर्भ हटा दिए जाते हैं। – pepr
@pepr यह सही है। – Marcin
हाँ, इसलिए जिस कुंजी को मैं याद कर रहा था वह है डिलीट ऑपरेशन केवल संदर्भ को हटा देता है, मेमोरी क्लीयरेंस कचरा कलेक्टर – 0xc0de