2009-04-09 16 views
58

इस रूप में लापता का कहना है:समारोह अजगर में अधिक भार:

http://web.archive.org/web/20090624083829/http://mail.python.org/pipermail/python-list/2003-May/206149.html

समारोह से अधिक भार अजगर में अनुपस्थित है।

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

हालांकि गुजरने वाले तर्कों की संख्या की गणना करना और फिर नौकरी करना एक ओवरकिल की तरह है।

+3

तो? आपको क्या लगता है कि आपको ओवरलोडिंग की आवश्यकता है? – kquinn

+2

वास्तविक प्रश्न के रूप में बंद करने के लिए वोटिंग। यह कहना नहीं है कि यह एक संभावित मान्य बिंदु नहीं है, लेकिन यह कोई सवाल नहीं है। –

+0

ठीक है, फिर एक ऐसी भाषा का उपयोग करें जो अधिभार प्रदान करता है ... –

उत्तर

31

बताया गया है तनाव कम, मूलभूत मूल्यों के साथ कीवर्ड तर्क एक लंबा रास्ता तय कर सकते हैं।

मैं यह भी कहूंगा कि मेरी राय में, यह पाइथन की भावना के खिलाफ चला जाता है ताकि विधियों में किस तरह के प्रकार पारित किए जा सकें। पायथन में, मुझे लगता है कि यह बतख टाइपिंग का उपयोग करने के लिए अधिक स्वीकार्य है - यह पूछने के बजाय कि कोई ऑब्जेक्ट क्या कर सकता है।

def print_names(names): 
    """Takes a space-delimited string or an iterable""" 
    try: 
     for name in names.split(): # string case 
      print name 
    except AttributeError: 
     for name in names: 
      print name 

फिर आप इन दोनों में से किसी कर सकता है::

print_names("Ryan Billy") 
print_names(("Ryan", "Billy")) 

एक API हालांकि तरह

इस प्रकार, आपके विधि एक स्ट्रिंग या एक टपल स्वीकार कर सकते हैं, तो आप कुछ इस तरह कर सकते हैं जो कभी-कभी डिज़ाइन समस्या को इंगित करता है।

+36

फिर डिज़ाइन समस्या के बिना एक उदाहरण कृपया। – accuya

+1

अनुमोदित, यह थोड़ा सा योगदान है, लेकिन यह int/str की एक सूची है और मानकों को [6-ए-जेड]/i' मानता है 1-26: https://gist.github.com/cmattoon/abeed5fb8367b0b869cf –

6

अक्सर आप सुझावों का उपयोग कीवर्ड तर्कों का उपयोग करते हैं, डिफ़ॉल्ट मानों के साथ। उसमें देखो।

22

आपको फ़ंक्शन ओवरलोडिंग की आवश्यकता नहीं है, क्योंकि आपके पास * args और ** kwargs तर्क हैं।

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

उदाहरण के लिए, यदि आपके पास कोड है जो एक पूर्णांक या पूर्णांक की सूची को संभाल सकता है, तो आप इसे फिर से चालू करने का प्रयास कर सकते हैं और यदि आप सक्षम नहीं हैं, तो आप मानते हैं कि यह एक पूर्णांक है और आगे बढ़ें। बेशक यह एक फ्लोट हो सकता है, लेकिन जहां तक ​​व्यवहार का संबंध है, यदि एक फ्लोट और एक int समान दिखाई देता है, तो उन्हें इंटरचेंज किया जा सकता है।

+6

ओवरलोडिंग सख्ती से प्रकारों के बारे में नहीं है, यह तर्कों की संख्या के बारे में भी है। उदाहरण के लिए, मैं एक एकल विधि नाम साझा करने के लिए अपने एक्सेसर और म्यूटेटर (या "गेटर" और "सेटर" को पसंद कर सकता हूं), लेकिन वे एक तर्क की उपस्थिति के आधार पर स्पष्ट रूप से अलग-अलग चीजें कर रहे हैं। इसका तर्क के प्रकार से कोई लेना देना नहीं है। – Nerdmaster

6

आप एक म्यूटेबल कंटेनर डेटाटाइप को किसी फ़ंक्शन में पास कर सकते हैं, इसमें कुछ भी शामिल हो सकता है।

यदि आपको एक अलग कार्यक्षमता की आवश्यकता है, तो कार्यों को अलग-अलग नाम दें, या यदि यू को एक ही इंटरफ़ेस की आवश्यकता है, तो बस एक इंटरफ़ेस फ़ंक्शन (या विधि) लिखें जो प्राप्त डेटा के आधार पर उचित रूप से फ़ंक्शंस को कॉल करता है।

यह मेरे लिए कुछ समय लिया इस जावा से आ रही करने के लिए समायोजित करने के लिए, लेकिन यह वास्तव में, एक "बड़ा बाधा"

37

नहीं है अब जब तक आप अजगर सिंटैक्स का उपयोग सी ++ कोड लिखने की कोशिश कर रहे हैं, आप क्या होगा के लिए अधिभार की आवश्यकता है?

मुझे लगता है कि यह बिल्कुल विपरीत है, अधिभार केवल दृढ़ता से टाइप की गई भाषाओं को पाइथन की तरह कार्य करने के लिए आवश्यक है। पायथन में आपके पास कीवर्ड तर्क है, आपके पास *args और **kwargs है।

उदाहरण के लिए देखें: What is a clean, pythonic way to have multiple constructors in Python?

+54

आपका मूल्यांकन ओवरलोडिंग _ "विकलांग भाषाओं के लिए हैक-काम" _ अत्यधिक ध्रुवीकरण लगता है और स्थैतिक टाइपिंग के लाभ को अनदेखा करता है, और इसकी उपयुक्तता एक अलग प्रकार की तैनाती के लिए अनदेखी करता है। [स्टेफानो बोरिनी का जवाब] (http://stackoverflow.com/a/733385/322333) कि _ ".. फ़ंक्शन ओवरलोडिंग इस विचार पर आधारित है कि विभिन्न प्रकारों को पार करने से आप अलग-अलग कोड निष्पादित करेंगे। यदि आपके पास गतिशील रूप से टाइप की गई भाषा है पायथन, आपको टाइप करके अलग नहीं होना चाहिए "_ मुझे लगता है कि अधिक जानकारीपूर्ण और सहायक है। – boycy

+8

बेशक, आप सी ++ में परिवर्तनीय तर्कों का भी उपयोग कर सकते हैं, फिर भी ओवरलोडिंग कोड * क्लीन * रखने के लिए उपयोग किया जाता है। जैसा कि, एक समारोह एक कार्य करता है, जिसमें एक समारोह होता है, यदि बयान में क्या किया गया था, इसके आधार पर क्या करना है, यह जानने का प्रयास कर रहा है। – Nerdmaster

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