अजगर में अतिभारित कार्य?


91

क्या पायथन में ओवरलोड कार्यों को करना संभव है? C # में मैं कुछ ऐसा करूंगा

void myfunction (int first, string second)
{
//some code
}
void myfunction (int first, string second , float third)
{
//some different code
}

और फिर जब मैं फ़ंक्शन को कॉल करता हूं तो यह तर्कों की संख्या के आधार पर दोनों के बीच अंतर करता है। क्या पायथन में कुछ ऐसा ही करना संभव है?


यह एक संभव डुप्लिकेट पोस्ट लगता है। कृपया सी # के रूप में फ्लैग न करें क्योंकि प्रश्न का सी # से कोई लेना-देना नहीं है। फंक्शन-ओवरलोडिंग-इन-पाइथन-लापता
जेथ्रो


जवाबों:


103

EDIT पायथन 3.4 में नए एकल प्रेषण सामान्य कार्यों के लिए, http://www.python.org/dev/peps/pep-0443/ देखें

आपको आमतौर पर पायथन में कार्यों को अधिभारित करने की आवश्यकता नहीं है। पायथन गतिशील रूप से टाइप किया गया है , और कार्यों के लिए वैकल्पिक तर्क का समर्थन करता है।

def myfunction(first, second, third = None):
    if third is None:
        #just use first and second
    else:
        #use all three

myfunction(1, 2) # third will be None, so enter the 'if' clause
myfunction(3, 4, 5) # third isn't None, it's 5, so enter the 'else' clause

3
लेकिन ध्यान दें कि तर्कों के प्रकार के आधार पर विभिन्न कार्यों को कॉल करना बहुत अधिक कठिन है (हालांकि असंभव नहीं है)।
एंड्रयू जफ

9
खैर, ओवरलोडिंग / बहुरूपता और सशर्त के बीच अंतर है। क्या आपका मतलब है कि हमारे पास पॉलिमोर्फिस्म की जरूरत नहीं है क्योंकि हमारे पास सशर्त हैं?
वैल

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

1
@Val मैं कह रहा हूं कि वैकल्पिक तर्क और गतिशील प्रकारों के बीच जिस तरह से आप उनके पास पायथन में हैं, आपको बहुरूपता को प्राप्त करने के लिए जावा स्टाइल विधि की आवश्यकता नहीं है।
18

3
@navidoo मैं तर्क देता हूं कि यह एक अच्छा विचार नहीं है - एक फ़ंक्शन पूरी तरह से विभिन्न प्रकार की चीजों को वापस नहीं करता है। हालांकि, आप हमेशा मुख्य फ़ंक्शन के अंदर एक स्थानीय जनरेटर फ़ंक्शन को परिभाषित कर सकते हैं, इसे कॉल कर सकते हैं, और परिणामस्वरूप जनरेटर वापस कर सकते हैं - बाहर से यह उसी तरह होगा जैसे कि मुख्य फ़ंक्शन एक जनरेटर था। यहाँ उदाहरण है।
एएफएफ

50

सामान्य अजगर में आप वह नहीं कर सकते जो आप चाहते हैं। वहाँ दो करीब सन्निकटन हैं:

def myfunction(first, second, *args):
    # args is a tuple of extra arguments

def myfunction(first, second, third=None):
    # third is optional

हालांकि, यदि आप वास्तव में ऐसा करना चाहते हैं , तो आप निश्चित रूप से इसे काम कर सकते हैं (परंपरावादियों के अपमान के जोखिम पर; ओ)। संक्षेप में, आप एक wrapper(*args)फ़ंक्शन लिखेंगे जो उपयुक्त के रूप में तर्कों और प्रतिनिधियों की संख्या की जांच करता है। इस तरह की "हैक" आमतौर पर सज्जाकारों के माध्यम से की जाती है। इस मामले में आप कुछ हासिल कर सकते हैं:

from typing import overload

@overload
def myfunction(first):
    ....

@myfunction.overload
def myfunction(first, second):
    ....

@myfunction.overload
def myfunction(first, second, third):
    ....

और आप इसे overload(first_fn) फंक्शन (या कंस्ट्रक्टर) बनाकर लागू कर सकते हैं, एक कॉल करने योग्य ऑब्जेक्ट लौटाते हैं, जहाँ __call__(*args) विधि ऊपर बताए गए डेलिगेशन और overload(another_fn) विधि अतिरिक्त कार्यों को जोड़ती है जिन्हें डेलिगेट किया जा सकता है।

आप यहाँ कुछ इसी तरह का एक उदाहरण देख सकते हैं http://acooke.org/pytyp/pytyp.spec.dispatch.html, लेकिन यह प्रकार के तरीकों को ओवरलोड कर रहा है। यह एक बहुत ही समान दृष्टिकोण है ...

अद्यतन: और कुछ इसी तरह (तर्क प्रकार का उपयोग करके) अजगर 3 में जोड़ा जा रहा है - http://www.python.org/dev/peps/pep-0443/


rangeनिर्मित अधिभार का उपयोग करता है, तो यह वास्तव में एक हैक है? github.com/python/typeshed/blob/master/stdlib/2and3/…
CptJero

9

हाँ, यह मुमकिन है। मैंने पायथन 3.2.1 में नीचे कोड लिखा है:

def overload(*functions):
    return lambda *args, **kwargs: functions[len(args)](*args, **kwargs)

उपयोग:

myfunction=overload(no_arg_func, one_arg_func, two_arg_func)

ध्यान दें कि overloadफ़ंक्शन द्वारा लौटाए गए लंबो को अनाम तर्कों की संख्या के आधार पर कॉल करने के लिए फ़ंक्शन का चयन करें ।

समाधान सही नहीं है, लेकिन फिलहाल मैं कुछ बेहतर नहीं लिख सकता।


1

सीधे संभव नहीं। आप दी गई दलीलों पर स्पष्ट प्रकार की जाँचों का उपयोग कर सकते हैं, हालाँकि यह आम तौर पर गलत है।

अजगर गतिशील है। यदि आप अनिश्चित हैं कि कोई वस्तु क्या कर सकती है, तो बस कोशिश करें: और उस पर एक विधि को कॉल करें, फिर: त्रुटियों को छोड़कर।

यदि आपको प्रकारों के आधार पर ओवरलोड करने की आवश्यकता नहीं है, लेकिन केवल तर्कों की संख्या के आधार पर, कीवर्ड तर्कों का उपयोग करें।


3
मुझे नहीं लगता कि उन्हें वैकल्पिक तर्कों के बारे में पता था।
एगफ

0

अजगर में ओवरलोडिंग के तरीके मुश्किल हैं। हालाँकि, वहाँ डिक्टेट, सूची या आदिम चर को पार करने का उपयोग किया जा सकता है।

मैंने अपने उपयोग के मामलों के लिए कुछ करने की कोशिश की है, इससे लोगों को तरीकों को ओवरलोड करने के लिए समझने में मदद मिल सकती है।

स्टैकओवरफ़्लो धागे में से एक में उदाहरण का उपयोग करते हैं:

एक वर्ग अधिभार विधि विभिन्न वर्ग से कॉल विधियों के साथ।

def add_bullet(sprite=None, start=None, headto=None, spead=None, acceleration=None):

दूरस्थ वर्ग से तर्क पारित करें:

add_bullet(sprite = 'test', start=Yes,headto={'lat':10.6666,'long':10.6666},accelaration=10.6}

या add_bullet(sprite = 'test', start=Yes,headto={'lat':10.6666,'long':10.6666},speed=['10','20,'30']}

इसलिए, विधि अधिभार से सूची, शब्दकोश या आदिम चर के लिए हैंडलिंग प्राप्त की जा रही है।

इसे अपने कोड के लिए आज़माएं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.