__Init__ के अंदर एक क्लास फंक्शन को कॉल करना


132

मैं कुछ कोड लिख रहा हूं जो फ़ाइल नाम लेता है, फ़ाइल खोलता है, और कुछ डेटा को पार्स करता है। मैं एक कक्षा में ऐसा करना चाहता हूं। निम्नलिखित कोड काम करता है:

class MyClass():
    def __init__(self, filename):
        self.filename = filename 

        self.stat1 = None
        self.stat2 = None
        self.stat3 = None
        self.stat4 = None
        self.stat5 = None

        def parse_file():
            #do some parsing
            self.stat1 = result_from_parse1
            self.stat2 = result_from_parse2
            self.stat3 = result_from_parse3
            self.stat4 = result_from_parse4
            self.stat5 = result_from_parse5

        parse_file()

लेकिन इसमें मुझे __init__अपनी कक्षा के लिए फ़ंक्शन के दायरे में सभी पार्सिंग मशीनरी को शामिल करना है । इस सरलीकृत कोड के लिए यह अब ठीक लग रहा है, लेकिन फ़ंक्शन के parse_fileसाथ-साथ इंडक्शन के कुछ स्तर भी हैं। मैं फ़ंक्शन parse_file()को नीचे दिए गए क्लास फ़ंक्शन के रूप में परिभाषित करना चाहता हूं :

class MyClass():
    def __init__(self, filename):
        self.filename = filename 

        self.stat1 = None
        self.stat2 = None
        self.stat3 = None
        self.stat4 = None
        self.stat5 = None
        parse_file()

    def parse_file():
        #do some parsing
        self.stat1 = result_from_parse1
        self.stat2 = result_from_parse2
        self.stat3 = result_from_parse3
        self.stat4 = result_from_parse4
        self.stat5 = result_from_parse5

बेशक यह कोड काम नहीं करता है क्योंकि फ़ंक्शन फ़ंक्शन parse_file()के दायरे में नहीं है __init__। क्या __init__उस कक्षा के भीतर से किसी क्लास फ़ंक्शन को कॉल करने का कोई तरीका है ? या मैं इस बारे में गलत तरीके से सोच रहा हूं?


क्या कोई कारण है कि कोड उदाहरण को "स्टेट" के पांच संस्करणों की आवश्यकता है? यह पढ़ने के लिए आसान होगा अगर केवल एक ही होगा।
465 बीपी

जवाबों:


183

फ़ंक्शन को इस तरह से कॉल करें:

self.parse_file()

आपको अपने parse_file () फ़ंक्शन को इस तरह परिभाषित करने की आवश्यकता है:

def parse_file(self):

parse_fileविधि यह बुला पर एक वस्तु को बाध्य होने के लिए (क्योंकि यह एक स्थिर विधि नहीं है) है। यह ऑब्जेक्ट के इंस्टेंस पर फ़ंक्शन को कॉल करके किया जाता है, आपके मामले में इंस्टेंस है self


हाँ! यह ठीक वही है जिसकी मुझे तलाश थी। धन्यवाद!
पायथनजैन

33

यदि मैं गलत नहीं हूं, तो दोनों कार्य आपकी कक्षा का हिस्सा हैं, आपको इसका उपयोग इस तरह करना चाहिए:

class MyClass():
    def __init__(self, filename):
        self.filename = filename 

        self.stat1 = None
        self.stat2 = None
        self.stat3 = None
        self.stat4 = None
        self.stat5 = None
        self.parse_file()

    def parse_file(self):
        #do some parsing
        self.stat1 = result_from_parse1
        self.stat2 = result_from_parse2
        self.stat3 = result_from_parse3
        self.stat4 = result_from_parse4
        self.stat5 = result_from_parse5

अपनी लाइन बदलें:

parse_file() 

साथ में:

self.parse_file()

क्या आप बता सकते हैं कि इसका उपयोग क्यों किया जाना चाहिए self.parse_file()और क्या नहीं parse_file()?
ivanleoncz

@ अपरितोषसिंह को फ़ंक्शन के def parse_file(self):तहत नेस्टेड नहीं किया जाना चाहिए __init__ताकि आपके पास आंशिक रूप से प्रारंभिक ऑब्जेक्ट न हो?
डॉनरनडॉन

@ivanleoncz parse_file उदाहरण विधि है, हमें कॉल करने के लिए संदर्भ ऑब्जेक्ट का उपयोग करने की आवश्यकता है।
परितोष सिंह

@rong यदि यह कोड आदरणीय है और आप बाहर से पार्स फाइल सेट करने की अनुमति नहीं देना चाहते हैं, तो हाँ इसे नेस्टेड किया जाना चाहिए।
परितोष सिंह

12

कैसा रहेगा:

class MyClass(object):
    def __init__(self, filename):
        self.filename = filename 
        self.stats = parse_file(filename)

def parse_file(filename):
    #do some parsing
    return results_from_parse

वैसे, अगर आप नामित चर है stat1, stat2आदि, स्थिति एक टपल के लिए भीख माँग रहा है: stats = (...)

तो parse_fileएक ट्यूपल को वापस आने दें , और टपल को अंदर स्टोर करें self.stats

फिर, उदाहरण के लिए, आप उस चीज़ तक पहुँच सकते हैं जिसका उपयोग किया जाता stat3है self.stats[2]


मैं सहमत हूं, मैं सिर्फ self.stat5 के माध्यम से self.stat1 को अंदर डालता हूं ताकि यह दिखाया जा सके कि कुछ वर्ग चर थे जो मैं असाइन कर रहा था। वास्तविक कोड में मेरे पास अधिक सुरुचिपूर्ण समाधान है।
पायथनजीन

यदि मैं parse_fileफ़ंक्शन की एक विधि बनना चाहता हूं तो इसे कैसे बदला जाना चाहिए MyClass। कहां selfजरूरी होगा ?
n1k31t4


0

आपको इस तरह parse_file की घोषणा करनी चाहिए; def parse_file(self)। "स्व" पैरामीटर अधिकांश भाषाओं में एक छिपा हुआ पैरामीटर है, लेकिन अजगर में नहीं। आपको इसे उन सभी तरीकों की परिभाषा में जोड़ना होगा जो एक वर्ग के हैं। तब आप फ़ंक्शन का उपयोग करके कक्षा के अंदर किसी भी विधि से कॉल कर सकते हैंself.parse_file

आपका अंतिम कार्यक्रम इस तरह दिखाई देगा:

class MyClass():
  def __init__(self, filename):
      self.filename = filename 

      self.stat1 = None
      self.stat2 = None
      self.stat3 = None
      self.stat4 = None
      self.stat5 = None
      self.parse_file()

  def parse_file(self):
      #do some parsing
      self.stat1 = result_from_parse1
      self.stat2 = result_from_parse2
      self.stat3 = result_from_parse3
      self.stat4 = result_from_parse4
      self.stat5 = result_from_parse5

-13

मुझे लगता है कि आपकी समस्या वास्तव में इनिट फ़ंक्शन को सही ढंग से न करने के साथ है। यह इस तरह होना चाहिए

class MyClass():
     def __init__(self, filename):
          pass

     def parse_file():
          pass

न ही आपका कोड है। जब तक आप @staticmethodडेकोरेटर को parse_file
रतनप्लान

कम से कम selfअपने parse_fileतरीके से लापता को जोड़ें ।
रतनप्लान

ओह, खेद है कि "क्लास मायक्लास ():" लाइन के तहत इंडेंटिंग की एक अतिरिक्त परत होनी चाहिए। मैंने इसे ऊपर तय कर दिया है, लेकिन सवाल वही है।
PythonJin
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.