Какво представляват магическите методи в Python и как да ги използвате

Една от по-малко известните, но ценни функции на Python е възможността за прилагане на магически методи върху обекти. Използвайки магически методи, можем да напишем по-чист код, който е интуитивен и лесен за разбиране.

С магически методи можем да създадем интерфейси за взаимодействие с обекти по начин, който се чувства по-питоничен. Тази статия ще ви запознае с магическите методи, ще обсъди най-добрите практики за създаването им и ще проучи често срещаните магически методи, които ще срещнете.

Какво представляват магическите методи?

Магическите методи са методи на Python, които определят как се държат обектите на Python, когато върху тях се извършват обичайни операции. Тези методи са ясно дефинирани с двойно подчертаване преди и след името на метода.

В резултат на това те обикновено се наричат ​​​​dunder методи, като двойно подчертаване. Често срещан метод на dunder, който може би вече сте срещали, е методът __init__(), който се използва за дефиниране на конструктори на класове.

Обикновено методите на dunder не са предназначени да бъдат извиквани директно във вашия код; по-скоро те ще бъдат извикани от интерпретатора, докато програмата работи.

Защо магическите методи са полезни?

Магическите методи са полезна концепция в обектно-ориентираното програмиране в Python. Използвайки ги, вие определяте поведението на вашите потребителски типове данни, когато се използват с общи, вградени операции. Тези операции включват:

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

🟢 Операции за сравнение

🟢 Операции през жизнения цикъл

🟢 Представителска дейност

Следващият раздел ще обсъди как да внедрите магически методи, които определят как се държи приложението, когато се използва във всички от горните категории.

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

Както бе споменато по-рано, магическите методи определят поведението на обектите. Като такива, те се дефинират като част от класа на обекта. Тъй като те са част от обектния клас, те приемат като първи аргумент self, който е препратка към самия обект.

  Как да използвате OneDrive за търсене на изображения и документи по текста в тях

Те могат да приемат допълнителни аргументи в зависимост от това как ще бъдат извикани от преводача. Те също така са ясно дефинирани с две долни черти преди и след имената им.

Внедряване

Голяма част от това, което обсъдихме досега, изглежда теоретично и абстрактно. В този раздел ще имплементираме прост клас Rectangle.

Този клас ще има свойства за дължина и ширина. С помощта на метода __init__ можете да укажете тези свойства при инстанциране. Освен това ще можете да сравнявате различни правоъгълници, за да видите дали е равен, по-малък или по-голям от друг с помощта на операторите ==, < и >. И накрая, правоъгълникът трябва да може да осигури смислено низово представяне.

Настройване на среда за кодиране

За да следвате това ръководство, ще ви е необходима среда за изпълнение на Python. Можете да използвате локален или можете да използвате онлайн компилатора pctechbg.net Python.

Създаване на класа Rectangle

Първо, нека започнем с дефинирането на класа Rectangle.

class Rectangle:
    pass

Създаване на метода на конструктора

След това нека създадем нашия първи магически метод, методът на конструктора на класа. Този метод ще вземе височината и ширината и ще ги съхрани като атрибути на екземпляра на класа.

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

Създаване на магически метод за представяне на низове

След това искаме да създадем метод, който позволява на нашия клас да генерира четим от човека низ за представяне на обекта. Този метод ще бъде извикан винаги, когато извикаме функцията str(), предавайки инстанция на класа Rectangle като аргумент. Този метод също ще бъде извикан, когато извиквате функции, които очакват аргумент от низ, като например функцията за печат.

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

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

Методът __str__() трябва да върне низ, който бихте искали да представлява обекта. В този случай връщаме низ във формат Rectangle(, ), където височината и ширината са съхранените размери на правоъгълника.

  Как да коригирате проблеми с Wi-Fi връзката на Samsung TV

Създаване на магически методи за операции за сравнение

След това искаме да създадем оператори за сравнение за операциите равно, по-малко и по-голямо. Това се нарича претоварване на оператора. За да ги създадем, ние използваме магическите методи __eq__, __lt__ и __gt__ съответно. Тези методи ще върнат булева стойност след сравняване на площите на правоъгълниците.

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

Както можете да видите, тези методи приемат два параметъра. Първият е текущият правоъгълник, а вторият е другата стойност, с която се сравнява. Тази стойност може да бъде друг екземпляр на Rectangle или всяка друга стойност. Логиката за това как сравнението и условията, при които сравнението ще върне вярно, зависят изцяло от вас.

Обичайни магически методи

В този следващ раздел ще обсъдим често срещаните магически методи, които ще срещнете и използвате.

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

Аритметичните магически методи се извикват, когато екземпляр от вашия клас е поставен от лявата страна на аритметичен знак. Методът ще бъде извикан с два аргумента, като първият е препратка към екземпляра. Втората стойност е обектът отдясно на знака. Методите и признаците са следните:

NameMethodSignDescriptionAddition__add__+Внедрява добавяне. Subtraction__sub__–Реализира изваждане.Multiplication__mul__*Реализира multiplicationDivision__div__/Реализира деление.Floor division__floordiv__//Реализира деление на етаж.

#2. Операции за сравнение

Подобно на аритметичните магически методи, тези методи се извикват, когато екземпляр от класа, за който са дефинирани, е поставен отляво на оператора за сравнение. Освен това, подобно на аритметичните магически методи, те се извикват с два параметъра; първият е препратка към екземпляра на обекта. Второто е препратка към стойността от дясната страна на знака.

NameMethodSignDescriptionLess than__lt__<Прилага по-малкото от сравнениетоGreater than__gt__>Внедрява по-голямото от сравнениетоEqual to__eq__==Внедрява равното на сравнениетоLess than или равно на__le__>=Внедрява по-малкото от или равното на сравнениетоGreater от или равно на__ge__<=Внедрява по-голямото или равно на сравнение

  Как да актуализирате Microsoft Edge

#3. Операции на жизнения цикъл

Тези методи ще бъдат извикани в отговор на различните методи на жизнения цикъл на даден обект, като например инстанциране или изтриване. Конструкторът __init__ попада в тази категория. Често срещаните методи в тази категория са изброени в таблицата по-долу:

NameMethodDescriptionConstructor__init__Този метод се извиква всеки път, когато обект от класа, за който е дефиниран, бъде изтрит. Може да се използва за извършване на действия за почистване, като затваряне на всички файлове, които е отворил. Deletion__del__Този метод се извиква всеки път, когато обект от класа, за който е дефиниран, бъде изтрит. Може да се използва за извършване на действия за почистване, като затваряне на всички файлове, които е отворил. New__new__Методът __new__ се извиква първо, когато се инстанцира обект от посочения клас. Този метод се извиква преди конструктора и приема класа, както и всички допълнителни аргументи. Връща екземпляр на класа. В по-голямата си част не е много полезно, но е описано подробно тук.

#4. Представителни операции

NameMethodDescriptionStr__str__Връща четимо от човека низово представяне на обекта. Този метод се извиква, когато извикате функцията str(), предавайки екземпляр на класа като аргумент. Извиква се и когато преминете в екземпляра към функциите print() и format(). Има за цел да предостави низ, който е разбираем за крайния потребител на приложението. Repr__repr__Връща низово представяне на обекта, който се използва от разработчика. В идеалния случай върнатият низ трябва да е богат на информация, така че да можете да конструирате идентичен екземпляр на обекта само от низа.

Най-добри практики за създаване на магически методи

Магическите методи са невероятни и ще опростят кода ви. Въпреки това е важно да имате предвид следните неща, когато ги използвате.

  • Използвайте ги пестеливо – внедряването на твърде много магически методи във вашите класове прави кода ви труден за разбиране. Ограничете се до прилагането само на основните.
  • Уверете се, че разбирате последиците за производителността на методи като __setatrr__ и __getattr__, преди да ги използвате.
  • Документирайте поведението на вашите магически методи, така че другите разработчици да знаят точно какво правят. Това ги улеснява да ги използват и да отстраняват грешки, когато е необходимо.

Заключителни думи

В тази статия представих магически методи като начин за създаване на класове, които могат да се използват с вградени операции. Също така обсъдих как се дефинират и прегледах пример за клас, който прилага магически методи. След това споменах различните методи, които вероятно ще използвате и от които се нуждаете, преди да споделя няколко най-добри практики, които да имате предвид.

След това може да искате да научите как да имплементирате класа Counter в Python.