Шта су магичне методе у Питхон-у и како их користити

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

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

Шта су магичне методе?

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

Као резултат тога, они се обично називају дундер методама, као у двострукој доњој црти. Уобичајена дундер метода коју сте можда већ срели је __инит__() метода која се користи за дефинисање конструктора класа.

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

Зашто су магичне методе корисне?

Магичне методе су користан концепт у објектно оријентисаном програмирању у Питхон-у. Користећи их, одређујете понашање ваших прилагођених типова података када се користе са уобичајеним, уграђеним операцијама. Ове операције укључују:

🟢 Аритметичке операције

🟢 Операције поређења

🟢 Операције животног циклуса

🟢 Репрезентативне операције

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

Како дефинисати магичне методе

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

  Како изградити свој блог на DigitalOcean-у са Ghost-ом и Next.js-ом

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

Имплементација

Много тога о чему смо до сада разговарали изгледа теоријски и апстрактно. У овом одељку ћемо имплементирати једноставну класу Рецтангле.

Ова класа ће имати својства дужине и ширине. Користећи методу __инит__, можете навести ова својства приликом инстанцирања. Поред тога, моћи ћете да упоредите различите правоугаонике да видите да ли је једнак, мањи или већи од другог користећи операторе ==, < и >. На крају, правоугаоник би требао бити способан да пружи смислену репрезентацију стрингова.

Подешавање окружења за кодирање

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

Креирање класе правоугаоника

Прво, почнимо са дефинисањем класе Рецтангле.

class Rectangle:
    pass

Креирање методе конструктора

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

class Rectangle:
    def __init__(self, height, width):
        self.height = height
        self.width = width

Креирање магичног метода за репрезентацију низова

Затим желимо да креирамо метод који омогућава нашој класи да генерише човеку читљив стринг који представља објекат. Овај метод ће бити позван сваки пут када позовемо функцију стр() која прослеђује инстанцу класе Рецтангле као аргумент. Овај метод ће се такође позвати када позовете функције које очекују стринг аргумент, као што је функција штампања.

class Rectangle:
    def __init__(self, height, width):
        self.height = height
        self.width = width

    def __str__(self):
        return f'Rectangle({self.height}, {self.width})'

Метода __стр__() треба да врати стринг који желите да представљате објекат. У овом случају, враћамо стринг формата Рецтангле(<хеигхт>, <видтх>) где су висина и ширина сачуване димензије правоугаоника.

Креирање магичних метода за операције поређења

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

class Rectangle:
    def __init__(self, height, width):
        self.height = height
        self.width = width

    def __str__(self):
        return f'Rectangle({self.height}, {self.width})'

    def __eq__(self, other):
        """ Checking for equality """
        return self.height * self.width == other.height * other.width

    def __lt__(self, other):
        """ Checking if the rectangle is less than the other one """
        return self.height * self.width < other.height * other.width

    def __gt__(self, other):
        """ Checking if the rectage is greater than the other one """
        return self.height * self.width > other.height * other.width

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

  Како онемогућити УФВ заштитни зид у Линуку

Уобичајене магијске методе

У овом следећем одељку ћемо разговарати о уобичајеним магијским методама на које ћете наићи и које ћете користити.

#1. Аритметичке операције

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

НамеМетходСигнДесцриптионАддитион__адд__+Имплементира додавање. Субтрацтион__суб__–Имплементира одузимање.Множење__мул__*Имплементира множењеДивисион__див__/Имплементира дељење.Флоор дивисион__флоордив__//Имплементира поделу.

#2. Операције поређења

Као и методе аритметичке магије, ове методе се позивају када се инстанца класе за коју су дефинисане постави лево од оператора поређења. Такође, као и методе аритметичке магије, оне се позивају са два параметра; прва је референца на инстанцу објекта. Други је референца на вредност са десне стране знака.

НамеМетходСигнДесцриптионЛесс тхан__лт__<Имплементира мање од поређењаГреатер тхан__гт__>Имплементира веће од поређењаЕкуал то__ек__==Имплементира једнако поређањуМање од или једнако__ле__>=Имплементира мање или једнако или упореди веће од_ једнако_<Имплементира веће од_м једнако_ поређење

#3. Операције животног циклуса

Ове методе ће бити позване као одговор на различите методе животног циклуса објекта, као што су инстанцирање или брисање. Конструктор, __инит__ спада у ову категорију. Уобичајене методе у овој категорији су наведене у табели испод:

НамеМетходДесцриптионЦонструцтор__инит__Ова метода се позива кад год се избрише објекат класе за коју је дефинисана. Може се користити за обављање радњи чишћења као што је затварање свих датотека које је отворио. Делетион__дел__Ова метода се позива кад год се избрише објекат класе за коју је дефинисан. Може се користити за обављање радњи чишћења као што је затварање свих датотека које је отворио. Нев__нев__ Метода __нев__ се прво позива када се инстанцира објекат наведене класе. Овај метод се позива пре конструктора и узима класу као и све додатне аргументе. Враћа инстанцу класе. Углавном, није превише корисно, али је овде детаљно обрађено.

  Гоогле Меет у односу на Зоом: који је прави за вас?

#4. Репресентатион Оператионс

НамеМетходДесцриптионСтр__стр__Враћа човеку читљиву репрезентацију стрингова објекта. Овај метод се позива када позовете функцију стр(), прослеђујући инстанцу класе као аргумент. Такође се позива када прослеђујете инстанцу функцијама принт() и формат(). Намењен је да обезбеди стринг који је разумљив крајњем кориснику апликације. Репр__репр__Враћа стринг приказ објекта који користи програмер. У идеалном случају, враћени стринг треба да буде богат информацијама тако да можете конструисати идентичну инстанцу објекта само из стринга.

Најбоље праксе за прављење магијских метода

Магичне методе су невероватне и поједноставиће ваш код. Међутим, важно је имати на уму следеће ствари када их користите.

  • Користите их штедљиво – Примена превише магичних метода у вашим часовима отежава разумевање вашег кода. Ограничите се на примену само суштинских.
  • Уверите се да разумете импликације метода као што су __сетатрр__ и __гетаттр__ пре него што их употребите.
  • Документујте понашање ваших магијских метода како би други програмери могли тачно да знају шта раде. Ово им олакшава да их користе и отклањају грешке када је то потребно.

Завршне речи

У овом чланку сам представио магичне методе као начин за прављење класа које се могу користити са уграђеним операцијама. Такође сам разговарао о томе како су дефинисани и прошао кроз пример класе коју су имплементирале магијске методе. Затим сам поменуо различите методе које ћете вероватно користити и које ће вам требати пре него што поделите неколико најбољих пракси које треба да имате на уму.

Затим ћете можда желети да научите како да имплементирате класу Цоунтер у Питхон-у.