Разумевање преоптерећења функција у Питхон-у

Преоптерећење функција је функција у неким програмским језицима која вам омогућава да дефинишете варијације исте функције. Свака варијанта има исто име, али различите имплементације, са јединственим потписима функција.

Ова техника вам омогућава да изводите различите операције на основу типа и броја аргумената који се прослеђују функцији.

За разлику од језика као што су Ц++ и Јава, Питхон подразумевано не подржава преоптерећење функција, али постоје начини да се постигне слична функционалност.

Како се Питхон носи са преоптерећењем функција?

У Питхон-у можете дефинисати исту функцију више пута са различитим параметрима, типовима података или обоје у свакој дефиницији. Међутим, Питхон ће препознати само последњу дефиницију функције када је позовете. Ево примера:

 def arithmetics(a, b):
    return a - b

def arithmetics(a, b, c, d):
    return a + b - c * d

print(arithmetics(1, 2, 3, 5))
print(arithmetics(1, 2))

Објектно оријентисани језици, као што је Јава, често подржавају преоптерећење функција и метода. Метода је једноставно функција коју дефинишете унутар класе.

У горњем коду, Питхон ће препознати само другу дефиницију функције аритхметицс() када покушате да је позовете у свом пројекту. Ако покушате да позовете функцију са два аргумента као што је прво дефинисано, добићете грешку која каже „недостају потребни позициони аргументи“.

Нећете добити грешку када позовете функцију са четири аргумента. То значи да је Питхон преписао функцију својом најновијом инстанцом. Ово није понашање преоптерећења, тако да га морате решити.

  Снимите снимке екрана и снимајте снимке екрана

Дакле, Питхон подразумевано не обрађује преоптерећење функција, али постоје неки трикови које можете користити да симулирате његово понашање у својим програмима.

Метод 1: Коришћење опционих параметара или подразумеваних аргумената

Можете постићи преоптерећење дефинисањем функције са подразумеваним аргументима. Ево примера:

 def arithmetics(a, b=0, c=0):
    """
    Arguments:
    a: The first number.
    b: The second number (optional).
    c: The third number (optional).
    """
    return a - b + c

Ова функција има три параметра, али два од њих имају подразумеване вредности. То значи да га можете позвати са између једног и три аргумента:

 print(arithmetics(1)) 
print(arithmetics(2, 5))
print(arithmetics(10, 3, 4))

Иако вам овај приступ омогућава да позовете функцију на неколико различитих начина, дугорочно није много ефикасан. Ево неких од његових ограничења:

  • Можете прослеђивати само аргументе који су цели бројеви или плутајући.
  • Нема значајне промене у понашању функције. На пример, не можете променити његово понашање да бисте израчунали површину облика или чак одштампали Хелло Ворлд.

Метод 2: Коришћење променљивих аргумената

Да бисте користили променљиве аргументе за преоптерећење функције у Питхон-у, требало би да укључите параметар аргс када дефинишете своју функцију. Параметар аргс вам омогућава да проследите више позиционих аргумената приликом позивања ваше функције. Ево примера:

 def arithmetics(a, *args):
    """
    Arguments:
    a: The first number.
    *args: A variable number of arguments (optional).
    """
    args_sum = 0

    for num in args:
        args_sum *= num

    return a - args_sum

print(arithmetics(1))
print(arithmetics(2, 5))
print(arithmetics(10, 3, 4, 2, 4, 6))

Горња функција узима два аргумента: обавезни аргумент који се зове а и аргумент аргс, који вам омогућава да унесете онолико аргумената колико вам је потребно.

  Како клонирати Коди конфигурацију и дуплирати ваше подешавање

Иако може узети више аргумената, горња функција може извршити операцију множења само над променљивим аргументима, тј. аргументима представљеним кључном речи аргс.

Ако желите да извршите више операција, морате да уведете условне изразе у свој код, а то може брзо да постане компликовано.

Метод 3: Коришћење декоратора вишеструке отпреме

Декоратор вишеструког отпремања је Питхон библиотека која вам омогућава да дефинишете више имплементација или инстанци једне функције, на основу типа њених аргумената. То значи да можете дефинисати исту функцију са различитим типовима података и променити њено понашање у потпуности.

Да бисте користили декоратер вишеструке отпреме, следите ове кораке:

  • Инсталирајте мултипледиспатх у свом Питхон окружењу:
     pip install multipledispatch
  • Украсите своју(е) функцију(е) помоћу @диспатцх декоратера. Декоратор @диспатцх је Питхон декоратор који вам омогућава да имплементирате вишеструко отпремање. Аутоматски ће послати одговарајућу функцију на основу аргумената које јој проследите. Можете користити @диспатцх декоратер пратећи овај образац:
     from multipledispatch import dispatch

    @dispatch(data type1, data type2, data typeX)
    def your_function(a, b, c, x):
        pass
        

  • Ево примера који користи декоратор вишеструког отпремања за преоптерећење функција у Питхон-у:

     from multipledispatch import dispatch

    @dispatch(int, int)
    def add(a, b):
        """
        Arguments:
        a: Any integer.
        b: Any integer.
        """
        return a + b

    @dispatch(int, list)
    def add(a, b):
        """
        Arguments:
        a: Any integer.
        b: Any Python list.
        """
        b.append(a)
        return b


    print(add(1, 2))


    print(add(1, [2, 3, 4, 5, 'w', 'done']))

    Исечак кода изнад дефинише две инстанце функције адд(). Прва инстанца узима два цела броја као своје аргументе и враћа њихов збир.

    У међувремену, друга верзија ове функције узима цео број и листу. Додаје цео број листи и враћа нову листу.

      7 најбољих алата за проверу цитата за побољшање вашег истраживања

    Овај приступ преоптерећењу функција у Питхон-у даје вам велику флексибилност, посебно ако треба да промените понашање свог метода. Можете сазнати више од вишеструка отпремна документација.

    Најбољи приступ преоптерећењу функција у Питхон-у

    Приступ који користите за преоптерећење функција треба да зависи од тога шта покушавате да постигнете. Ако можете да завршите свој задатак користећи подразумеване или променљиве аргументе, онда би декоратор вишеструког отпремања могао бити претерани. Међутим, декоратер за вишеструке отпреме је обично најбоља опција за његову ефикасност и тачност.

    Овај декоратер пружа чист и флексибилан начин имплементације преоптерећења функција у Питхон-у. Омогућава вам да дефинишете више имплементација једне функције на основу типа њених аргумената.

    Овим приступом можете креирати флексибилне функције које могу прихватити различите типове параметара без потребе за сложеним условним изразима.