तुम खुद आप कैसे किया है को लागू कर सकता है, ठीक उसी प्रकार है, लेकिन एक सूची उपवर्ग कि फ्लश कॉल (के साथ) एक आइटम का उपयोग करने के प्रयास करने से पहले।
जाहिर है आप इसे हर एक्सेस पर नहीं करना चाहते हैं, लेकिन आप मरने पर सूची को गंदे चिह्नित करने के लिए कमजोर संदर्भ पर कॉलबैक सेट करके इसे अनुकूलित कर सकते हैं। तब अंतिम सूची के बाद से कुछ की मृत्यु हो जाने पर आपको केवल सूची को फ्लश करने की आवश्यकता है।
यहां इस विधि का उपयोग करके लागू एक सूची वर्ग है। (ध्यान दें कि इसका परीक्षण नहीं किया गया है, और कुछ विधियों को बहुत कुशलता से कार्यान्वित नहीं किया गया है (उदाहरण के लिए, जो सिर्फ वास्तविक सूची में परिवर्तित होते हैं और उस पर विधि को कॉल करते हैं), लेकिन यह एक उचित प्रारंभिक बिंदु होना चाहिए:
import weakref
class WeakList(list):
def __init__(self, seq=()):
list.__init__(self)
self._refs = []
self._dirty=False
for x in seq: self.append(x)
def _mark_dirty(self, wref):
self._dirty = True
def flush(self):
self._refs = [x for x in self._refs if x() is not None]
self._dirty=False
def __getitem__(self, idx):
if self._dirty: self.flush()
return self._refs[idx]()
def __iter__(self):
for ref in self._refs:
obj = ref()
if obj is not None: yield obj
def __repr__(self):
return "WeakList(%r)" % list(self)
def __len__(self):
if self._dirty: self.flush()
return len(self._refs)
def __setitem__(self, idx, obj):
if isinstance(idx, slice):
self._refs[idx] = [weakref.ref(obj, self._mark_dirty) for x in obj]
else:
self._refs[idx] = weakref.ref(obj, self._mark_dirty)
def __delitem__(self, idx):
del self._refs[idx]
def append(self, obj):
self._refs.append(weakref.ref(obj, self._mark_dirty))
def count(self, obj):
return list(self).count(obj)
def extend(self, items):
for x in items: self.append(x)
def index(self, obj):
return list(self).index(obj)
def insert(self, idx, obj):
self._refs.insert(idx, weakref.ref(obj, self._mark_dirty))
def pop(self, idx):
if self._dirty: self.flush()
obj=self._refs[idx]()
del self._refs[idx]
return obj
def remove(self, obj):
if self._dirty: self.flush() # Ensure all valid.
for i, x in enumerate(self):
if x == obj:
del self[i]
def reverse(self):
self._refs.reverse()
def sort(self, cmp=None, key=None, reverse=False):
if self._dirty: self.flush()
if key is not None:
key = lambda x,key=key: key(x())
else:
key = apply
self._refs.sort(cmp=cmp, key=key, reverse=reverse)
def __add__(self, other):
l = WeakList(self)
l.extend(other)
return l
def __iadd__(self, other):
self.extend(other)
return self
def __contains__(self, obj):
return obj in list(self)
def __mul__(self, n):
return WeakList(list(self)*n)
def __imul__(self, n):
self._refs *= n
return self
[संपादित करें] एक और पूरी सूची कार्यान्वयन जोड़े
आप को परिभाषित करें "मैन्युअल रूप से हटाने के" "संदर्भ" "मर", "फ्लश", हो सकता है? यह सवाल वास्तव में उन लोगों के बिना ज्यादा समझ में नहीं आता है। – hop
मर = कमजोर संदर्भ अमान्य हो जाता है ("मृत")। संदर्भ = एक कमजोर संदर्भ (http://docs.python.org/library/weakref.html)। फ्लश = सूची में सभी संदर्भों पर मैन्युअल रूप से = पुनरावृत्ति को हटा दें जो अमान्य हैं उन्हें हटा दें। – Dan
अभी तक बहुत स्पष्ट नहीं है, जब तक कि आप पहले से ही नहीं जानते कि – hop