2011-11-15 8 views
22

मैं आवृत्ति की विशेषता के मान का उपयोग कर एक आवृत्ति विधि में एक डिफ़ॉल्ट तर्क पास करना चाहता हूं:एक विधि के लिए एक आवृत्ति सदस्य के डिफ़ॉल्ट तर्क मान कैसे पास करें?

class C: 
    def __init__(self, format): 
     self.format = format 

    def process(self, formatting=self.format): 
     print(formatting) 

जब कोशिश कर रहा है, तो मुझे निम्न त्रुटि संदेश मिलता है:

NameError: name 'self' is not defined 

मैं चाहता हूं कि इस तरह व्यवहार करने की विधि:

C("abc").process()  # prints "abc" 
C("abc").process("xyz") # prints "xyz" 

यहां समस्या क्या है, यह क्यों काम नहीं करती है? और मैं यह काम कैसे कर सकता हूं?

+0

प्रारूप में प्रारूप का उपयोग नहीं करते हैं, क्योंकि यह पाइथन में अंतर्निहित फ़ंक्शन है। – Yajushi

+0

'प्रक्रिया विधि' में 'स्वयं' की गलती को संपादित करना –

उत्तर

31

आप इसे वास्तव में डिफ़ॉल्ट मान के रूप में परिभाषित नहीं कर सकते हैं, क्योंकि डिफ़ॉल्ट मान का मूल्यांकन तब किया जाता है जब विधि परिभाषित की जाती है जो कि किसी भी उदाहरण से पहले है। एक आसान काम के आसपास इस तरह कुछ करने के लिए है:

class C: 
    def __init__(self, format): 
     self.format = format 

    def process(self, formatting=None): 
     formatting = formatting if formatting is not None else self.format 
     print(formatting) 

self.format केवल तभी formattingNone है इस्तेमाल किया जाएगा।

def mk_default(): 
    print("mk_default has been called!") 

def myfun(foo=mk_default()): 
    print("myfun has been called.") 

print("about to test functions") 
myfun("testing") 
myfun("testing again") 

और यहाँ उत्पादन:


कैसे मूलभूत मूल्यों काम की बात को प्रदर्शित करने के लिए, इस उदाहरण देख

mk_default has been called! 
about to test functions 
myfun has been called. 
myfun has been called. 

सूचना कैसे mk_default केवल एक बार है कि कहा जाता था, और समारोह से पहले कभी कहा गया था!

+0

मेरा मानना ​​है कि 'moo_default' को ब्रांड्स के कारण' foo = mk_default() 'कहा जाता है, क्योंकि इसे कॉल किया जाता है। यह 'foo = mk_default' नहीं होना चाहिए? फिर आपका उदाहरण 'myfun (" test ") में बदल सकता है, इसके बाद 'myfun()'। – gary

+0

क्या यह अभी भी अनुशंसित कामकाज है? – confused00

+2

ध्यान दें कि 'स्वरूपण = स्वरूपण या स्वयं .format' 'formatting' को' self.format' 'पर सेट करेगा यदि' स्वरूपण' एक झूठा मान है, जैसे कि 0। यह सिर्फ मुझे काटता है। एक स्वरूपण 'स्वरूपण = स्वरूपण टाइप करना है यदि फ़ॉर्मेटिंग कोई और नहीं है self.format' या समकक्ष। – Godsmith

6

पायथन में, self नाम विशेष नहीं है। यह पैरामीटर नाम के लिए सिर्फ एक सम्मेलन है, यही कारण है कि पैरामीटर __init__ में है। (वास्तव में, __init__ नहीं बहुत ही खास या तो है, और विशेष रूप से यह नहीं वास्तव में वस्तु बनाने ... कि एक लंबे समय तक कहानी है करता है)

C("abc").process() एक C उदाहरण बनाता है, C कक्षा में process विधि को देखता है, और उस पैरामीटर को C उदाहरण के साथ पहले पैरामीटर के रूप में कॉल करता है। तो यदि आप इसे प्रदान करते हैं तो यह self पैरामीटर में समाप्त हो जाएगा।

भले ही आपके पास वह पैरामीटर था, भले ही आपको def process(self, formatting = self.formatting) जैसे कुछ लिखने की अनुमति नहीं दी जाएगी, क्योंकि self उस बिंदु पर नहीं है जहां आप डिफ़ॉल्ट मान सेट करते हैं। पायथन में, पैरामीटर के लिए डिफ़ॉल्ट मान गणना की जाती है जब फ़ंक्शन संकलित होता है, और फ़ंक्शन पर "अटक" होता है। (यही कारण है कि, यदि आप [] जैसे डिफ़ॉल्ट का उपयोग करते हैं, तो उस सूची में फ़ंक्शन में कॉल के बीच परिवर्तन याद आएंगे।)

मैं यह काम कैसे कर सकता हूं?

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

+0

आपका कामकाज किसी भी का उपयोग करने पर वांछित आउटपुट को पूरा नहीं करता है। –

+0

यदि 'कोई नहीं' 'स्वरूपण' के लिए मान्य मान है, तो आपको कुछ और चुनना होगा, जैसा मैंने समझाया था। –

1

"स्वयं" को किसी भी वर्ग के कार्यों के लिए पहली तर्क के रूप में पारित करने की आवश्यकता है यदि आप उन्हें गैर स्थैतिक तरीकों के रूप में व्यवहार करना चाहते हैं।

यह ऑब्जेक्ट को ही संदर्भित करता है। आप डिफ़ॉल्ट तर्क के रूप में "स्वयं" को पारित नहीं कर सके क्योंकि इसकी स्थिति पहली तर्क के रूप में ठीक है।

के बजाय "स्वरूपण = self.format" उपयोग "स्वरूपण = कोई नहीं" आपके मामले में और उसके बाद के रूप में नीचे दिए गए कोड से मूल्य निर्दिष्ट:

[संपादित करें]

class c: 
     def __init__(self, cformat): 
      self.cformat = cformat 

     def process(self, formatting=None): 
      print "Formating---",formatting 
      if formatting == None: 
       formatting = self.cformat 
       print formatting 
       return formatting 
      else: 
       print formatting 
       return formatting 

c("abc").process()   # prints "abc" 
c("abc").process("xyz")  # prints "xyz" 

नोट: का उपयोग नहीं करते परिवर्तनीय नाम के रूप में "प्रारूप", क्योंकि यह पाइथन

+0

ठीक है, मैंने 'स्वयं' समस्या को सही किया। लेकिन आपका जवाब वांछित आउटपुट को पूरा नहीं करता है। –

+0

संपादित ब्लॉक की जांच करें, यह आपकी मदद करेगा। – Yajushi

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