में ऑब्जेक्ट आवंटन को ट्रैक करना क्या कोई तरीका है जिसे मैं ओवरराइड कर सकता हूं जो मुझे मेरी कक्षा के आवंटन के हर बार ट्रैक रखने के लिए प्रिंट स्टेटमेंट/पीडीबी/आदि का उपयोग करने की अनुमति देगा? कुछ ऑब्जेक्ट्स को अनपिक करते समय मुझे कुछ ऐसा लगता है जो कभी भी __setstate__
या __init__
पर कॉल नहीं किया गया है। मैंने __new__
ओवरराइड करने की कोशिश की और __new__
में किए गए प्रत्येक ऑब्जेक्ट की आईडी को प्रिंट करना, लेकिन मुझे अभी भी उन आईडी के साथ ऑब्जेक्ट्स का सामना करना पड़ रहा है जिन्हें कभी मुद्रित नहीं किया गया था।पायथन
संपादित करें: यहाँ मेरी कोड मैं फेरबदल के लिए उपयोग है (instrumenting) object
खुद के अलावा मेरी कक्षा का __new__
और उसके सुपर कक्षाओं के सभी:
class Allocator:
def __init__(self, my_class):
self.my_class = my_class
self.old_new = my_class.__new__
def new(self, * args, ** kargs):
rval = self.old_new(*args, ** kargs)
#rval = super(self.my_class,cls).__new__(cls)
print 'Made '+str(self.my_class)+' with id '+str(id(rval))
return rval
def replace_allocator(cls):
if cls == object:
return
setattr(cls,'__new__',Allocator(cls).new)
print cls.__base__
try:
for parent in cls.__base__:
replace_allocator(parent)
except:
replace_allocator(cls.__base__)
मैं के रूप में मेरे वर्गों की मूल वर्ग पर replace_allocator फोन जैसे ही इसे मुख्य लिपि में आयात किया जाता है। मेरी कक्षा के साथ शुरू करने के लिए एक कस्टम __new__
है, जो आईडी को प्रिंट करता है।
क्या आप बिल्कुल निश्चित हैं कि वे अलग-अलग उदाहरण हैं? क्या आपने आईडी आईडी (इंस्टेंस) 'मैचों की जांच की है? –
क्या आप एक प्रकार के कलाकार के रूप में 'आवंटक (सीएलएस)' का उपयोग करने की कोशिश कर रहे हैं? यदि ऐसा है, तो यह गलत है, क्योंकि पायथन में यह 'ऑलोकेटर' ऑब्जेक्ट के लिए एक कन्स्ट्रक्टर कॉल है, और '.new' भाग को एक नया बाध्य-विधि उदाहरण मिलेगा। – Apalala
रोश: हाँ। मेरा आवंटक फ़ंक्शन दिखाता है कि मैं आईडी (उदाहरण) प्रिंट करता हूं। बाद में, जब मुझे कोई ऑब्जेक्ट मिलता है जिसमें कुछ फ़ील्ड गुम हो जाते हैं जिन्हें सेटस्टेट या इनिट द्वारा जोड़ा जाना चाहिए था, तो मैं भी अपनी आईडी प्रिंट करता हूं। अगर मैं उस आईडी के लिए पहले प्रिंटआउट में grep करता हूं तो कोई हिट नहीं होती है। –