2016-05-26 4 views
5

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

def func(): 
    print 1 

class A: 
    pass 

obj = A() 
obj.func = func 

यह भी काम करता है अगर हम del func द्वारा मुख्य दायरे में समारोह को हटा दें।

तब विधि पद्धतियों का उपयोग क्यों करना चाहेंगे? क्या यह सिर्फ एक सम्मेलन या अच्छी प्रोग्रामिंग आदत है?

+1

हालांकि यह वास्तव में 'obj' के लिए कोई विधि नहीं जोड़ रहा है। 'obj.func()' बस 'func() 'को कॉल करने जैसा ही है। एक विधि उदाहरण को 1. स्थितित्मक तर्क के रूप में प्राप्त करती है। आप 'func .__ के साथ एक बाध्य विधि बना सकते हैं __ (obj, ए) ', लेकिन यह काम नहीं करेगा, क्योंकि' func' कोई तर्क नहीं लेता है। –

+0

आपके फ़ंक्शन 'func' में' self' तर्क नहीं है। जब आप कक्षा के * विधि * को संलग्न या प्रतिस्थापित करना चाहते हैं तो आप 'टाइप' का उपयोग करते हैं। यहां आप बस एक वर्ग में * फ़ंक्शन * संलग्न कर रहे हैं .. – Cyrbil

उत्तर

3

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

    अपने मामले में
  • , तो आप सिर्फ एक वस्तु को एक समारोह देते हैं, तो आप निश्चित रूप से यह कॉल कर सकते हैं, लेकिन यह है अनबाउंड, यह वस्तु ही (यानी। आप समारोह के अंदर self उपयोग नहीं कर सकते)
  • जब MethodType के साथ जोड़ा, तो आप एक बाध्य विधि बनाने के साथ कोई संबंध नहीं है और यह वस्तु के लिए एक सामान्य अजगर विधि की तरह व्यवहार करती है, आप करने के लिए है वस्तु यह के अंतर्गत आता है ले पहले तर्क के रूप में (यह सामान्य रूप से self कहा जाता है) और आप समारोह

इस उदाहरण के अंदर उस तक पहुँच सकते अंतर पता चलता है:

def func(obj): 
    print 'I am called from', obj 
class A: 
    pass 
a=A() 
a.func=func 
a.func() 

इस के साथ विफल एक TypeError: func() takes exactly 1 argument (0 given), इस कोड को उम्मीद से काम करता है, जबकि के रूप में:

import types 
a.func = types.MethodType(func, a, A) 
a.func() 

शो +०१२३९७९७०५८।

+0

तो संक्षेप में इसका मतलब है कि मैं उस ऑब्जेक्ट के गुणों का उपयोग करने में सक्षम नहीं हूं जिसका मैंने उपयोग किया था। उदाहरण के लिए यदि कोई विशेषता थी तो मेरी परिभाषा में 'att' कहें तो मैं इसका सही उपयोग नहीं कर पाऊंगा? – Existent

+0

आपके प्रश्न में आपके मामले में, कार्य वस्तु से decoupled है। फ़ंक्शन से ऑब्जेक्ट तक पहुंचने का कोई तरीका नहीं है क्योंकि फ़ंक्शन बिल्कुल एक विधि नहीं है। – mguijarr

+0

@ABHI no, 'att' को कहीं से भी एक्सेस किया जा सकता है, लेकिन आपको इसे एक्सेस करने के लिए कक्षा का एक उदाहरण चाहिए (यानी 'एटी' का मतलब कुछ भी नहीं है, आपको 'obj.att'' की आवश्यकता है)। सामान्य रूप से परिभाषित तरीके (और इसलिए बाध्य होते हैं) 'स्वयं' स्मारक प्राप्त करते हैं जो कि उदाहरण है कि विधि बाध्य है और इसलिए उनके पास उचित 'att' तक पहुंचने का एक आसान तरीका है। –

3

types.MethodType का एक सामान्य उपयोग यह जांच रहा है कि कुछ वस्तु एक विधि है या नहीं। उदाहरण के लिए:

>>> import types 
>>> class A(object): 
...  def method(self): 
...   pass 
... 
>>> isinstance(A().method, types.MethodType) 
True 
>>> def nonmethod(): 
...  pass 
... 
>>> isinstance(nonmethod, types.MethodType) 
False 

ध्यान रखें कि आपके उदाहरण में isinstance(obj.func, types.MethodType) रिटर्न False। कल्पना करें कि आपने कक्षा A में meth विधि को परिभाषित किया है। isinstance(obj.meth, types.MethodType)True वापस करेगा।