2011-11-01 3 views
8

EDIT2: आपकी सहायता के लिए सभी को धन्यवाद! संपादित करें: @staticmethod जोड़ने पर, यह काम करता है। हालांकि मैं अभी भी सोच रहा हूं कि मुझे यहां एक प्रकार की त्रुटि क्यों मिल रही है।पायथन में वर्ग से फ़ंक्शन को कॉल करना - अलग-अलग तरीके

मैंने अभी ओओपीएस शुरू कर दिया है और मैं पूरी तरह से नया हूं। मेरे पास एक वर्ग से एक समारोह को कॉल करने के विभिन्न तरीकों से संबंधित एक बहुत ही बुनियादी सवाल है।

class MathsOperations: 
    def __init__ (self, x, y): 
     self.a = x 
     self.b = y 
    def testAddition (self): 
     return (self.a + self.b) 

    def testMultiplication (self): 
     return (self.a * self.b) 

मैं निम्नलिखित कोड के साथ main.py कहा जाता है किसी अन्य फ़ाइल से इस वर्ग के बोल रहा हूँ:

from testClass import MathsOperations 

xyz = MathsOperations(2, 3) 
print xyz.testAddition() 

यह किसी भी मुद्दे के बिना काम करता मैं कोड के साथ एक testClass.py फ़ाइल है। हालांकि, मैं कक्षा को एक बहुत ही सरल तरीके से उपयोग करना चाहता था।

अब मैंने testClass.py फ़ाइल में निम्न कोड डाला है। मैंने इस बार इनिट फ़ंक्शन को छोड़ दिया है।

class MathsOperations: 
    def testAddition (x, y): 
     return x + y 

    def testMultiplication (a, b): 
     return a * b 

इसका उपयोग करके कॉल करना;

from testClass import MathsOperations 
xyz = MathsOperations() 
print xyz.testAddition(2, 3) 

यह काम नहीं करता है। क्या कोई बता सकता है कि 2 मामले में क्या गलत हो रहा है? मैं इस वर्ग का उपयोग कैसे करूं? ": TestAddition() लेता है वास्तव में ऐसे 2 तर्कों (3 दिए गए) लेखन त्रुटि"

उत्तर

14

आप स्वयं का उपयोग करना एक विधि के पहले पैरामीटर के रूप में

दूसरे मामले में आपको

का उपयोग करना चाहिए
class MathOperations: 
    def testAddition (self,x, y): 
     return x + y 

    def testMultiplication (self,a, b): 
     return a * b 

और अपने कोड में आप निम्नलिखित

tmp = MathOperations 
print tmp.testAddition(2,3) 

कर सकता है अगर आप एक चर पहले

print MathOperation.testAddtion(2,3) 

यह आपको एक त्रुटि देता है "लेखन त्रुटि: अनबाउंड विधि" instantiating बिना क्लास का उपयोग

यदि आप ऐसा करना चाहते हैं तो आपको @staticmethod सजावट

की आवश्यकता होगी

उदाहरण के लिए:

class MathsOperations: 
    @staticmethod 
    def testAddition (x, y): 
     return x + y 

    @staticmethod 
    def testMultiplication (a, b): 
     return a * b 

तो अपने कोड में आप इस्तेमाल कर सकते हैं

print MathsOperations.testAddition(2,3) 
+0

तो क्या @staticmethod टैग स्वचालित रूप से स्वयं पैरामीटर में डालता है? –

+0

यदि आप @staticmethod का उपयोग करते हैं तो आप उदाहरण के लिए पहले एक वैरिएबल घोषित किए बिना कक्षा का उपयोग कर सकते हैं, इस मामले में यदि आप MathOperation.testAddtion (2,3) का उपयोग करने का प्रयास करते हैं तो यह आपको एक त्रुटि देता है "TypeError: unbound method" –

+2

नहीं, staticmethod सजावट स्वयं पैरामीटर की आवश्यकता को हटा देता है। –

1

आप एक वर्ग का एक उदाहरण अपनी विधियों का उपयोग करने की आवश्यकता है

त्रुटि मैं मिलता है। या यदि आपको किसी भी वर्ग के चर (स्थिर पैरामीटर नहीं) तक पहुंचने की आवश्यकता नहीं है तो आप विधि को स्थिर के रूप में परिभाषित कर सकते हैं और इसका उपयोग तब भी किया जा सकता है जब कक्षा को तत्काल नहीं किया जाता है। बस अपनी विधियों के लिए @staticmethod सजावटी जोड़ें।

class MathsOperations: 
    @staticmethod 
    def testAddition (x, y): 
     return x + y 
    @staticmethod 
    def testMultiplication (a, b): 
     return a * b 

डॉक्स: http://docs.python.org/library/functions.html#staticmethod

+0

मैंने सवाल थोड़ा सा संपादित किया। इसके बारे में खेद है। –

+0

@ ऋषवशहरन कोई समस्या नहीं, अन्य उत्तरों में पहले से ही गायब 'स्वयं' तर्क का उल्लेख है। लेकिन अगर आपको क्लास पैरामीटर के साथ काम करने की ज़रूरत नहीं है तो भी मैं स्थिर तरीकों का उपयोग करूंगा। – rplnt

2

आपका प्रणालियां किसी ऑब्जेक्ट (अर्थात, आत्म) का उल्लेख नहीं है, तो आप का उपयोग करना चाहिए @staticmethod decorator:

class MathsOperations: 
    @staticmethod 
    def testAddition (x, y): 
     return x + y 

    @staticmethod 
    def testMultiplication (a, b): 
     return a * b 
+0

मैं सवाल संपादित कर रहा था। क्या आप वहां आतंक को समझा सकते हैं? मैं दो तर्क देता हूं अभी तक यह 3 तर्क कहता है। –

7

अस्वीकरण: यह एक बस इंगित जवाब नहीं है, यह है, और अधिक सलाह के एक टुकड़े की तरह है, भले ही उत्तर संदर्भों पर पाया जा सकता है

आईएमएचओ: पायथन में ऑब्जेक्ट उन्मुख प्रोग्रामिंग काफी बेकार है।

विधि प्रेषण बहुत सरल नहीं है, आपको बाध्य/अनबाउंड उदाहरण/कक्षा (और स्थैतिक!) विधियों के बारे में जानना आवश्यक है; आपके पास एकाधिक विरासत हो सकती है और विरासत और नई शैली कक्षाओं (आपकी पुरानी शैली थी) से निपटने की आवश्यकता है और पता है कि एमआरओ कैसे काम करता है, गुण ...

संक्षेप में: बहुत जटिल, हुड के नीचे कई चीजें हो रही हैं । मुझे यह भी कहना है कि यह अवांछित है, क्योंकि एक ही चीजों को हासिल करने के कई अलग-अलग तरीके हैं।

मेरी सलाह: केवल ओओपी का उपयोग करें जब यह वास्तव में उपयोगी हो। आम तौर पर इसका अर्थ कक्षाओं को लिखना है जो अच्छी तरह से ज्ञात प्रोटोकॉल को लागू करते हैं और शेष प्रणाली के साथ सहजता से एकीकृत करते हैं। ऑब्जेक्ट ओरिएंटेड कोड लिखने के लिए बस बहुत सी कक्षाएं न बनाएं।

इस पृष्ठों के लिए एक अच्छा पढ़ा लें:

आप उन्हें काफी उपयोगी मानते हैं।

यदि आप वास्तव में ओओपी सीखना चाहते हैं, तो मैं जावा जैसी अधिक पारंपरिक भाषा से शुरू करने का सुझाव दूंगा। यह पाइथन के रूप में आधा मजेदार नहीं है, लेकिन यह अधिक अनुमानित है।

+0

धन्यवाद। मैं पेजों की जांच करूंगा। –

+0

आपका स्वागत है! वैसे, सीधे जवाब यह है कि आपको त्रुटि मिलती है क्योंकि दुभाषिया बाध्य तरीकों के लिए 'स्वयं' पैरामीटर जोड़ता है, इसलिए आप तीन ('स्वयं' प्लस आपके दो आपूर्ति किए गए पूर्णांक) के साथ समाप्त होते हैं। – fortran

+0

आह! उस स्पष्टीकरण को समझ में आया। मैं आम तौर पर मूल पायथन दस्तावेज़ों से थके हुए हूं क्योंकि वे नौसिखिया मित्रवत नहीं हैं, जैसे कि "एक बाइट ऑफ बाइटन" जैसी साइटों का उपयोग करना पसंद करते हैं। –

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