Преоптерећење функција можда није уграђено у Питхон, али постоје начини да се то опонаша.
Преоптерећење функција је функција у неким програмским језицима која вам омогућава да дефинишете варијације исте функције. Свака варијанта има исто име, али различите имплементације, са јединственим потписима функција.
Ова техника вам омогућава да изводите различите операције на основу типа и броја аргумената који се прослеђују функцији.
За разлику од језика као што су Ц++ и Јава, Питхон подразумевано не подржава преоптерећење функција, али постоје начини да се постигне слична функционалност.
Како се Питхон носи са преоптерећењем функција?
У Питхон-у можете дефинисати исту функцију више пута са различитим параметрима, типовима података или обоје у свакој дефиницији. Међутим, Питхон ће препознати само последњу дефиницију функције када је позовете. Ево примера:
defarithmetics(a, b):
return a - bdefarithmetics(a, b, c, d):
return a + b - c * d
print(arithmetics(1, 2, 3, 5)) # returns -12
print(arithmetics(1, 2)) # returns missing positional arguments error
Објектно оријентисани језици, као што је Јава, често подржавају преоптерећење функција и метода. Метода је једноставно функција коју дефинишете унутар класе.
У горњем коду, Питхон ће препознати само другу дефиницију аритметика() функцију када покушате да је позовете у свом пројекту. Ако покушате да позовете функцију са два аргумента као што је прво дефинисано, добићете грешку која каже „недостају потребни позициони аргументи“.
Нећете добити грешку када позовете функцију са четири аргумента. То значи да је Питхон преписао функцију својом најновијом инстанцом. Ово није понашање преоптерећења, тако да се морате позабавити њиме.
Дакле, Питхон подразумевано не обрађује преоптерећење функција, али постоје неки трикови које можете користити да симулирате његово понашање у својим програмима.
Метод 1: Коришћење опционих параметара или подразумеваних аргумената
Можете постићи преоптерећење дефинисањем функције са подразумеваним аргументима. Ево примера:
defarithmetics(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)) # returns 1
print(arithmetics(2, 5)) # returns -3
print(arithmetics(10, 3, 4)) # returns 11
Иако вам овај приступ омогућава да позовете функцију на неколико различитих начина, дугорочно није ефикасан. Ево неких од његових ограничења:
- Можете прослеђивати само аргументе који су цели бројеви или плутајући.
- Нема значајне промене у понашању функције. На пример, не можете променити његово понашање да бисте израчунали површину облика или чак одштампали Здраво Свете.
Метод 2: Коришћење променљивих аргумената
Да бисте користили променљиве аргументе за преоптерећење функција у Питхон-у, требало би укључите параметар аргс када дефинишете своју функцију. Тхе аргс параметар вам омогућава да проследите више позиционих аргумената приликом позивања ваше функције. Ево примера:
defarithmetics(a, *args):
Arguments:
a: The first number.
*args: A variable number of arguments (optional).
args_sum = 0for num in args:
args_sum *= numreturn a - args_sum
print(arithmetics(1)) # returns 1
print(arithmetics(2, 5)) # returns 2
print(arithmetics(10, 3, 4, 2, 4, 6)) # returns 10
Горња функција узима два аргумента: позивани обавезни аргумент а анд тхе аргс аргумент, који вам омогућава да унесете онолико аргумената колико вам је потребно.
Иако може узети више аргумената, горња функција може извршити операцију множења само над променљивим аргументима, тј. аргументима представљеним аргс кључна реч.
Ако желите да извршите више операција, морате увести условне изјаве у свој код, а ово може брзо да се закомпликује.
Метод 3: Коришћење декоратора вишеструке отпреме
Декоратор вишеструког отпремања је Питхон библиотека која вам омогућава да дефинишете више имплементација или инстанци једне функције, на основу типа њених аргумената. То значи да можете дефинисати исту функцију са различитим типовима података и променити њено понашање у потпуности.
Да бисте користили декоратер вишеструке отпреме, следите ове кораке:
- Инсталирај мултипледиспатх у вашем Питхон окружењу:
pip install multipledispatch
- Украсите своју функцију(е) са @депеша декоратер. Тхе @депеша декоратер је а Питхон декоратер што вам омогућава да примените вишеструко отпремање. Аутоматски ће послати одговарајућу функцију на основу аргумената које јој проследите. Можете користити @депеша декоратер пратећи овај образац:
from multipledispatch import dispatch
@dispatch(data type1, data type2, data typeX)
defyour_function(a, b, c, x):
pass
# perform your operations here
Ево примера који користи декоратор вишеструког отпремања за преоптерећење функција у Питхон-у:
from multipledispatch import dispatch
@dispatch(int, int)
defadd(a, b):
Arguments:
a: Any integer.
b: Any integer.
return a + b@dispatch(int, list)
defadd(a, b):
Arguments:
a: Any integer.
b: Any Python list.
b.append(a)
return b# returns 3
print(add(1, 2))
# returns [2, 3, 4, 5, 'w', 'done', 1]
print(add(1, [2, 3, 4, 5, 'w', 'done']))
Исечак кода изнад дефинише две инстанце додати() функција. Прва инстанца узима два цела броја као своје аргументе и враћа њихов збир.
У међувремену, друга верзија ове функције узима цео број и листу. Додаје цео број листи и враћа нову листу.
Овај приступ преоптерећењу функција у Питхон-у даје вам велику флексибилност, посебно ако треба да промените понашање свог метода. Можете сазнати више од вишеструка отпремна документација.
Најбољи приступ преоптерећењу функција у Питхон-у
Приступ који користите за преоптерећење функције треба да зависи од тога шта покушавате да постигнете. Ако можете да завршите свој задатак користећи подразумеване или променљиве аргументе, онда би декоратор вишеструког отпремања могао бити претерани. Међутим, декоратер за вишеструке отпреме је обично најбоља опција за његову ефикасност и тачност.
Овај декоратер пружа чист и флексибилан начин имплементације преоптерећења функција у Питхон-у. Омогућава вам да дефинишете више имплементација једне функције на основу типа њених аргумената.
Овим приступом можете креирати флексибилне функције које могу прихватити различите типове параметара без потребе за сложеним условним изразима.