2011-01-25 3 views
10

में ऑब्जेक्ट आवंटन को ट्रैक करना क्या कोई तरीका है जिसे मैं ओवरराइड कर सकता हूं जो मुझे मेरी कक्षा के आवंटन के हर बार ट्रैक रखने के लिए प्रिंट स्टेटमेंट/पीडीबी/आदि का उपयोग करने की अनुमति देगा? कुछ ऑब्जेक्ट्स को अनपिक करते समय मुझे कुछ ऐसा लगता है जो कभी भी __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__ है, जो आईडी को प्रिंट करता है।

+0

क्या आप बिल्कुल निश्चित हैं कि वे अलग-अलग उदाहरण हैं? क्या आपने आईडी आईडी (इंस्टेंस) 'मैचों की जांच की है? –

+0

क्या आप एक प्रकार के कलाकार के रूप में 'आवंटक (सीएलएस)' का उपयोग करने की कोशिश कर रहे हैं? यदि ऐसा है, तो यह गलत है, क्योंकि पायथन में यह 'ऑलोकेटर' ऑब्जेक्ट के लिए एक कन्स्ट्रक्टर कॉल है, और '.new' भाग को एक नया बाध्य-विधि उदाहरण मिलेगा। – Apalala

+0

रोश: हाँ। मेरा आवंटक फ़ंक्शन दिखाता है कि मैं आईडी (उदाहरण) प्रिंट करता हूं। बाद में, जब मुझे कोई ऑब्जेक्ट मिलता है जिसमें कुछ फ़ील्ड गुम हो जाते हैं जिन्हें सेटस्टेट या इनिट द्वारा जोड़ा जाना चाहिए था, तो मैं भी अपनी आईडी प्रिंट करता हूं। अगर मैं उस आईडी के लिए पहले प्रिंटआउट में grep करता हूं तो कोई हिट नहीं होती है। –

उत्तर

0

क्या आप नई शैली के वर्गों का उपयोग कर रहे हैं? __setstate__ पर कॉल करने के लिए अचार के लिए, __getstate__ विधि को returning a non-False value कक्षा पर भी परिभाषित किया जाना चाहिए।

+0

यह वस्तुओं का पता लगाने के तरीके के बारे में सवाल का जवाब नहीं देता है। लेकिन हाँ, मैं नई शैली के वर्गों का उपयोग कर रहा हूं और मेरे पास '__getstate__' लागू है। इसके अलावा, '__setstate__' को सबसे ज्यादा बुलाया जा रहा है लेकिन कक्षा के सभी उदाहरण नहीं। –

5

(यह एक जवाब की तुलना में एक टिप्पणी की है।)

का हवाला देते हुए गुइडो के Unifying types and classes in Python 2.2:

स्थितियों में, जहां एक नया उदाहरण __init__ बुला बिना बनाई गई हो रहे हैं (उदाहरण के लिए जब उदाहरण भरी हुई है एक अचार से)। __new__ पर कॉल किए बिना एक नया उदाहरण बनाने का कोई तरीका नहीं है (हालांकि कुछ मामलों में आप बेस क्लास के __new__ पर कॉल करने से दूर हो सकते हैं)।

आप नई शैली वर्गों (object के वंशज) का उपयोग कर रहे हैं, तो __new__() हमेशा बुलाया जाना चाहिए। मुझे नहीं लगता कि अस्पष्ट मामलों "आप बेस क्लास के __new__ को कॉल करने से दूर हो सकते हैं" में दुर्घटनाग्रस्त हो जाएगा, हालांकि मुझे नहीं पता कि ये मामले वास्तव में क्या हैं।

और सिर्फ एक उदाहरण जोड़ने के लिए:

In [1]: class A(object): 
    ...:  def __new__(cls):  
    ...:   print "A" 
    ...:   return object.__new__(cls) 
    ...:  

In [2]: A() 
A 
Out[2]: <__main__.A object at 0xa3a95cc> 

In [4]: object.__new__(A) 
Out[4]: <__main__.A object at 0xa3a974c> 
+0

यह एक व्यवहार्य दृष्टिकोण की तरह लगता है लेकिन दुर्भाग्यवश यदि आप बेस क्लास को कॉल करने से दूर हो सकते हैं, तो यह समझा सकता है कि मेरे ज्ञान के बिना ऑब्जेक्ट्स आवंटित क्यों हो रही हैं। मुझे केवल 'ऑब्जेक्ट' के अलावा अन्य वर्गों के लिए '__new__' को ओवरराइड करने की अनुमति है। –

0

सुनिश्चित नहीं हैं कि अगर यह आपकी मदद कर सकता है, लेकिन अजगर का कचरा कलेक्टर introspective capabilities कि पर एक नज़र लेने लायक हो सकता है।

+0

प्रश्न वस्तु के * निर्माण * का ट्रैक रखने के बारे में है। –

+0

आप सही हैं, मैं शायद सवाल को गलत समझा। लेकिन अब मुझे आश्चर्य है, कचरा कलेक्टर को ऑब्जेक्ट आवंटन की निगरानी करने के लिए खुद की आवश्यकता नहीं होगी? यदि ऐसा है, तो कोई भी जीसी में हुक करने के लिए एक विधि तैयार कर सकता है और पता लगा सकता है कि रुचि की वस्तु कब आवंटित की जाती है। मैं आपसे क्या पूछताछ नहीं कर रहा हूं, मैं सिर्फ उत्सुक हूं। –