एक उदाहरण के रूप में मेरे पास नीचे दिए गए कोड को देखते हुए। प्रिंट स्टेटमेंट 1 का उपयोग करते समय लेकिन प्रिंट स्टेटमेंट 2 का उपयोग करते समय मुझे "फ्लोट ऑब्जेक्ट कॉल करने योग्य नहीं" त्रुटि क्यों मिलती है? अगर मैं प्रिंट स्टेटमेंट 1 को काम करना चाहता हूं तो मुझे अपनी कक्षा में क्या करने की ज़रूरत है?

var1 = float(input())

class ExampleClass(object):
    def __init__(self, thing1):
        self.getThing1 = thing1

    def getThing1(self):
        return self.getThing1

a = ExampleClass(var1)

print(str(a.getThing1())) #print statement 1 that doesn't work
print(str(a.getThing1)) #print statement 2 that does work
0
Jake2018 16 जुलाई 2018, 14:02

2 जवाब

आप getThing1 को एक विधि नाम और एक विशेषता के रूप में उपयोग करने का प्रयास कर रहे हैं। आप एक विधि getThing1 घोषित करते हैं, लेकिन फिर आप self.getThing1 = thing1 असाइन करते हैं। तो getThing1 अब कोई विधि नहीं है; यह thing1 का मान है।

शायद आपका मतलब यह था:

class ExampleClass(object):
    def __init__(self, thing1):
        self.thing1 = thing1

    def getThing1(self):
        return self.thing1

हालांकि, getXXX विधियां पायथन में सम्मेलन नहीं हैं। अगर आपको अपनी विशेषता को लपेटने के तरीके की आवश्यकता है, तो आपको इसे एक संपत्ति बनाना चाहिए .

9
khelwood 16 जुलाई 2018, 14:04

इस:

class ExampleClass(object):
    def __init__(self, thing1):
--->    self.getThing1 = thing1

यह छाया:

   def getThing1(self):
       return self.getThing1

पायथन फ़ंक्शन ऐसी वस्तुएं हैं जो एक अलग नाम स्थान में नहीं रहती हैं, इसलिए एक लंबी कहानी को छोटा करने के लिए आपके पास एक ही नाम से एक विशेषता और एक विधि नहीं हो सकती है।

समाधान सरल है: getThing1 को एक विशेषता नाम के रूप में प्रयोग न करें - विशेष रूप से चूंकि "प्राप्त करें" एक क्रिया है इसलिए यह एक मूल्य के लिए एक खराब नाम है।

यह भी ध्यान दें कि पायथन के पास गणना की गई विशेषताओं के लिए एक स्ट्रिंग समर्थन है, इसलिए आपको विशेषताओं के लिए व्यवस्थित गेटर्स/सेटर की आवश्यकता नहीं है। आप एक साधारण विशेषता के साथ शुरू कर सकते हैं और जरूरत पड़ने पर इसे बाद में एक गणना में बदल सकते हैं।

1
bruno desthuilliers 16 जुलाई 2018, 14:09