2016-02-08 10 views
7

की आवश्यकता है मुझे समझ में क्यों इस कोड काम करता हैं:विधि स्पष्ट `self` तर्क

class MyClass(object): 
    def f(self): print "Hello" 
    ff = f 
    def g(self): self.ff() 

MyClass().g() 

जबकि इस कार्य नहीं करता:

: के बाद से यह एक तर्क self.ff[0](self) जरूरत

class MyClass(object): 
    def f(self): print "Hello" 
    ff = f, 
    def g(self): self.ff[0]() 

MyClass().g() 

TypeError: f() takes exactly 1 argument (0 given) 

self.ff[0] == self.f पिछले मामले में self.ff == self.f जैसा नहीं है?

+0

मैं 100% निश्चित नहीं हूं, लेकिन विधियां कार्य हैं जो कक्षा के सदस्य हैं। आपके दूसरे उदाहरण में, एफएफ एक टुपल है, फ़ंक्शन नहीं है और एफएफ [0] MyClass का सदस्य नहीं है। यह सिर्फ एक समारोह है। –

+0

क्यों 'एफएफ [0] 'कक्षा का सदस्य नहीं है? –

+0

क्या यह एक बेहतर खिताब है? यह एक दिलचस्प सवाल है, इसके लिए धन्यवाद! –

उत्तर

3

आप अपनी कक्षा के सदस्य को प्रिंट करते समय अंतर देख सकते हैं।

अपना पहला उदाहरण के लिए आप पाएंगे कि समारोह एक (अन) बाध्य विधि से लपेटा जाता है जो आपके लिए self पैरामीटर संभालती है:

>>> MyClass.ff 
<unbound method MyClass.f> 
>>> MyClass().ff 
<bound method MyClass.f of <__main__.MyClass object at 0x7f53>> 

हुए अपने दूसरे उदाहरण में समारोह एक के रूप में प्रयोग किया जाता है सामान्य कार्य:

>>> MyClass.ff[0] 
<function f at 0x7f54> 
>>> MyClass().ff[0] 
<function f at 0x7f54> 
+0

चलिए सवाल बदलते हैं: दूसरे मामले में 'MyClass.ff [0]! = MyClass.f' –

+0

@RuggeroTurra इसी कारण से। 'MyClass.ff [0] 'एक फ़ंक्शन है जबकि' MyClass.f' इस फ़ंक्शन को लपेटने वाली एक अनबाउंड विधि है। – tynn

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