2010-04-06 12 views
14

में पिछली परिभाषित कक्षा को संपादित करने का अच्छा तरीका मैं आईपीथॉन में पिछली परिभाषित कक्षा के सदस्यों को फिर से परिभाषित करना चाहता हूं, तो मैं इसका पालन करने का एक अच्छा तरीका सोच रहा हूं। कहें: मैंने नीचे एक वर्ग परिचय परिभाषित किया है, और बाद में मैं फ़ंक्शन परिभाषा _print_api के भाग को फिर से परिभाषित करना चाहता हूं। इसे पुनः टाइप किए बिना ऐसा करने का कोई भी तरीका।ipython

class intro(object): 
    def _print_api(self,obj): 
      def _print(key): 
        if key.startswith('_'): 
          return '' 
        value = getattr(obj,key) 
        if not hasattr(value,im_func): 
          doc = type(valuee).__name__ 
        else: 
          if value.__doc__ is None: 
            doc = 'no docstring' 
          else: 
            doc = value.__doc__ 
        return '  %s  :%s' %(key,doc) 
        res = [_print(element) for element in dir(obj)] 
        return '\n'.join([element for element in res if element != '']) 
    def __get__(self,instance,klass): 
      if instance is not None: 
        return self._print(instance) 
      else: 
        return self._print_api(klass) 

उत्तर

0

ऐसा करने के लिए वास्तव में एक "अच्छा" तरीका नहीं है। सबसे अच्छा आप कर सकते हैं कुछ इस तरह है:

# class defined as normally above, but now you want to change a funciton 
def new_print_api(self, obj): 
    # redefine the function (have to rewrite it) 
    ... 
# now set that function as the _print_api function in the intro class 
intro._print_api = new_print_api 

यह भी आप पहले से ही परिचय वस्तुओं परिभाषित (अर्थात, जब आप एक उद्देश्य यह है कि पहले से ही बनाया गया था यह नया फोन करेगा पर introObject._print_api फोन है, तो काम करेंगे आपके द्वारा सेट किया गया फ़ंक्शन)। दुर्भाग्यवश, आपको अभी भी फ़ंक्शन को फिर से परिभाषित करना होगा, लेकिन कम से कम आपको पूरी कक्षा को फिर से लिखना नहीं है।

आपके उपयोग-मामले के आधार पर, करने के लिए सबसे अच्छी बात यह एक अलग मॉड्यूल में हो सकती है। import कक्षा और, जब आपको कुछ बदलने की आवश्यकता है, तो बस reload() फ़ंक्शन का उपयोग करें। हालांकि, यह कक्षा के पिछले उदाहरणों को प्रभावित नहीं करेगा (यह हो सकता है कि आप जो चाहते हैं हो या नहीं)।

0

जब आप उस बिंदु पर पहुंच जाते हैं जहां आपको इतना कोड मिल गया है, तो इसे केवल एक फ़ाइल में रखना और import उस विशेष मॉड्यूल में रखना सबसे आसान है। फिर जब आपको अपडेट करने की आवश्यकता होती है, तो आप फ़ाइल को संपादित कर सकते हैं और import कथन फिर से चला सकते हैं और आपको अपडेट किया गया कोड मिल जाएगा, हालांकि पहले परिभाषित ऑब्जेक्ट्स को अपडेट नहीं मिलेगा।

+2

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

5

आप IPython सुविधाओं% संपादित का उपयोग करते हैं, तो आप% संपादित करें आदेश, या उसके उर्फ% एड का प्रयोग करें जैसे this

10

कुछ का उपयोग कर सकते हैं। यह मानते हुए कि आईपीथॉन नेमस्पेस में परिचय वर्ग पहले से मौजूद है, %ed intro टाइपिंग कक्षा के स्रोत कोड पर बाहरी संपादक खोल देगा। जब आप संपादक को सहेजते हैं और बाहर निकलते हैं तो कोड को ipython द्वारा निष्पादित किया जाएगा, प्रभावी ढंग से कक्षा को फिर से परिभाषित किया जाएगा।

इसका नकारात्मक पक्ष यह है कि किसी भी उदाहरण जो पहले से मौजूद है, अभी भी कक्षा के पुराने संस्करण से बंधेगा - यदि यह एक मुद्दा है तो आपको ऑब्जेक्ट को फिर से बनाने या ओबीजे को फिर से असाइन करने की आवश्यकता है। कक्षा कक्षा के नए संस्करण को इंगित करने के लिए विशेषता।

आप मॉड्यूल, फ़ाइलों और पिछली इनपुट लाइनों पर %ed का भी उपयोग कर सकते हैं। %ed 5 10:13 16 ipython इनपुट लाइनों 5,10,11,12,13,16 से बना फ़ाइल बना और संपादित करेगा।

+0

वास्तव में अच्छी टिप! IPython को और अधिक ... –

+5

हम्म, क्या यह कक्षाओं/कार्यों के साथ काम करना चाहिए जो * परिभाषित * ipython में थे, या केवल आयातित लोगों के साथ? "Ipython में परिभाषित कक्षाएं" केस मेरे लिए काम नहीं करता है, मुझे 'चेतावनी मिलती है: फ़ाइल' कोई नहीं 'जहां' 'परिभाषित नहीं किया जा सकता है।' – weronika

+0

जो मैं ढूंढ रहा हूं भी - ipython में परिभाषित एक वर्ग को संपादित करने का एक अच्छा तरीका है। – Zitrax

संबंधित मुद्दे