मैं वर्तमान में उपयोग में आने वाले किसी निश्चित प्रकार की वस्तुओं का ट्रैक रखना चाहता हूं। उदाहरण के लिए: किसी वर्ग या सभी वर्गों के मेटाक्लास द्वारा बनाए गए सभी उदाहरणों का ट्रैक रखें।पायथन में: किसी ऑब्जेक्ट को किसी सूची से कैसे निकालें यदि इसे केवल उस सूची में संदर्भित किया गया हो?
यह इस तरह उदाहरणों का ट्रैक रखने के लिए आसान है:
class A():
instances = []
def __init__(self):
self.instances.append(self)
लेकिन अगर एक उदाहरण है कि सूची में यह अब कोई आवश्यकता नहीं किया जाएगा के बाहर कहीं भी संदर्भित नहीं है और मैं में है कि उदाहरण के कार्रवाई करने के लिए नहीं करना चाहते हैं एक संभावित समय लेने वाला पाश।
मैंने उन वस्तुओं को निकालने का प्रयास किया जो केवल sys.getrefcount का उपयोग करके सूची में संदर्भित हैं।
for i in A.instances:
if sys.getrefcount(i) <=3: # in the list, in the loop and in getrefcount
# collect and remove after the loop
मेरी समस्या यह है कि संदर्भ गणना बहुत अस्पष्ट है। एक नया खोल खुलने और के लिए
sys.getrefcount(DummyClass)
एक और विचार वस्तुओं तो कॉपी करने के लिए सूची और जाँच जो वस्तुओं कचरा एकत्र करने के लिए और हटाने अंतिम चरण में निर्धारित किये गये हटाने से कोई सामग्री रिटर्न 5 के साथ एक डमी वर्ग बनाने उन वस्तुओं। कुछ की तरह:
Copy = copy(A.instances)
del A.instances
A.instances = [i for i in Copy if not copy_of_i_is_in_GC(i)]
वस्तुओं तुरंत हटा दिया जाना चाहिए जब संदर्भ गिनती 0. को जाता है मैं सिर्फ वस्तुओं है कि अब और उपयोग नहीं किया जाता पर बहुत अधिक ressources बर्बाद करने के लिए नहीं करना चाहती नहीं है।
एक [कमजोर संदर्भ] (https://docs.python.org/3.5/library/weakref.html) – Barmar
http://stackoverflow.com/questions/12101958/keep-track-of-instances-in का उपयोग करें -पीथन –
http://effbot.org/pyfaq/how-do-i-get-a-list-of-all-instances-of-a-given-class.htm –