У величезному світі програмування на Python є набір функцій, які часто залишаються непоміченими початківцями, але мають важливе значення в екосистемі мови.
Магічні методи - це набір попередніх методівdefinites у Python, які надають спеціальні синтаксичні функції. Їх легко впізнати по подвійним тире на початку і в кінці, на кшталт __init__, __call__, __len__
… тощо
Чарівні методи дозволяють настроюваним об’єктам поводитися подібно до вбудованих типів Python.
У цій статті ми зосередимося на потужних функціях dunder. Ми вивчимо їх призначення та обговоримо їх використання.
Незалежно від того, чи є ви новачком у Python, чи досвідченим програмістом, ця стаття має на меті надати вам повне розуміння функцій Dunder, що зробить ваш досвід кодування на Python більш ефективним і приємним.
Пам’ятайте, магія Python полягає не лише в його простоті та універсальності, але й у його потужних функціях, таких як функції Dunder.
Мабуть, найосновніша функція dunder з усіх. Це чарівний метод, який Python автоматично викликає щоразу, коли ми створюємо (або, як випливає з назви, ініціалізуємо) новий об’єкт.__init__
клас піци:
def __init__(self, size, toppings):
self.size = розмір
self.toppings = начинки
# Тепер давайте створимо піцу
my_pizza = Піца ('великий', ['пепероні', 'гриби'])
print(my_pizza.size) # Це надрукує: великий
print(my_pizza.toppings) # Це виведе: ['pepperoni', 'mushrooms']
У цьому прикладі створюється клас під назвою Pizza. Ми встановили нашу функцію __init__, щоб включити параметри, які потрібно вказати під час ініціалізації, і встановили їх як властивості для нашого спеціального об’єкта.
Тут він використовується для представлення екземпляра класу. Отже, коли ми пишемо self.size = size, ми кажемо: «Гей, цей об’єкт pizza має атрибут size size
, і я хочу, щоб він був того розміру, який я вказав під час створення об’єкта».
Це магічний метод Python, який дозволяє нам це зробити defiзавершити опис для нашого нестандартного елемента.
Коли ви друкуєте об’єкт або перетворюєте його на рядок за допомогою str()
, перевірте Python, якщо у вас є defiЯ придумав метод __str__
для цього класу об'єкта.
Якщо так, використовуйте цей метод, щоб перетворити об’єкт на рядок.
Ми можемо розширити наш приклад Pizza, включивши функцію __str__
наступним чином:
class Pizza: def __init__(self, size, toppings): self.size = size self.toppings = toppings def __str__(self): return f"A {self.size} піца з {', '.join(self.toppings) )}" my_pizza = Pizza('large', ['pepperoni', 'mushrooms']) print(my_pizza) # Це виведе: Велика піца з пепероні, грибами
__repr__
Функція __str__ — це скоріше неформальний спосіб опису властивостей об’єкта. З іншого боку, __repr__ використовується для надання більш формального, детального та однозначного опису спеціального об’єкта.
Якщо дзвонити repr()
на об’єкті або просто введіть назву об’єкта в консоль, Python шукатиме метод __repr__
.
Se __str__
це не так defiпізно, Python використовуватиме __repr__
як резервну копію під час спроби надрукувати об’єкт або перетворити його на рядок. Тому часто це гарна ідея defiзакінчити хоча б __repr__
, навіть якщо ви цього не зробите defiвиходить __str__
.
Ось як ми могли defiніре __repr__
для нашого прикладу піци:
клас піци:
def __init__(self, size, toppings):
self.size = розмір
self.toppings = начинки
def __repr__(self):
return f"Pizza('{self.size}', {self.toppings})"
my_pizza = Піца ('великий', ['пепероні', 'гриби'])
print(repr(my_pizza)) # Виведе: Pizza('large', ['pepperoni', 'mushrooms'])
__repr__
дає вам рядок, який ви можете запустити як команду Python, щоб відтворити об’єкт pizza, тоді як __str__
дає вам більш людський опис. Сподіваюся, це допоможе вам трохи краще розжовувати ці дурні методи!
У Python ми всі знаємо, що можна додавати числа за допомогою оператора +
, Як 3 + 5
.
Але що, якщо ми хочемо додати екземпляри якогось спеціального об’єкта?
Функція дундера __add__
це дозволяє нам робити саме це. Це дає нам можливість defiнішувати поведінку оператора +
на наших персоналізованих предметах.
В інтересах узгодженості припустімо, що ми цього хочемо defiзавершити поведінку +
на прикладі нашої піци. Скажімо, щоразу, коли ми додаємо дві або більше піц разом, вони автоматично поєднуватимуть усі їхні начинки. Ось як це може виглядати:
клас піци:
def __init__(self, size, toppings):
self.size = розмір
self.toppings = начинки
def __add__(самий, інший):
якщо не isinstance(other, Pizza):
raise TypeError("Ви можете додати лише іншу піцу!")
new_toppings = self.toppings + other.toppings
повернути піцу (власний розмір, нова начинка)
# Давайте приготуємо дві піци
pizza1 = Pizza('великий', ['пепероні', 'гриби'])
pizza2 = Pizza('large', ['olives', 'pineapple'])
# А тепер давайте «додамо» їх
комбінована_піца = піца1 + піца2
print(combined_pizza.toppings) # Це виведе: ['pepperoni', 'mushrooms', 'olives', 'pineapple']
Подібно до dunder __add__
, ми також можемо defiзавершити інші арифметичні функції, наприклад __sub__
(шляхом віднімання за допомогою оператора -
) А __mul__
(для множення за допомогою оператора *
).
Цей метод dunder дозволяє нам defiзакінчити те, що функція len()
необхідно повернути за нашими індивідуальними речами.
Python використовує len()
щоб отримати довжину або розмір структури даних, такої як список або рядок.
У контексті нашого прикладу можна сказати, що «довжина» піци — це кількість начинок, які вона має. Ось як ми можемо це реалізувати:
клас піци:
def __init__(self, size, toppings):
self.size = розмір
self.toppings = начинки
def __len__(self):
повернути len(self.toppings)
# Давайте створимо піцу
my_pizza = Піца ('великий', ['пепероні', 'гриби', 'оливки'])
print(len(my_pizza)) # Це виведе: 3
У методі __len__ ми повертаємо лише довжину списку toppings
. Зараз, len(my_pizza)
це покаже нам, скільки начинок на ньому my_pizza
.
Цей метод dunder дозволяє об’єктам бути ітерованими, тобто його можна використовувати в циклі for.
Для цього ми повинні також defiзавершити функцію __next__
, Це використовується для defiзавершити поведінку, яка має повертати наступне значення в ітерації. Він також повинен сигналізувати про те, що в послідовності більше немає елементів. Зазвичай ми досягаємо цього, створюючи виняток StopIteration
.
Для нашого прикладу піци, скажімо, ми хочемо повторити начинку. Ми могли б зробити наш курс піци повторюваним definendo метод __iter__
:
клас піци:
def __init__(self, size, toppings):
self.size = розмір
self.toppings = начинки
def __iter__(self):
self.n = 0
повернути себе
def __next__(self):
якщо self.n < len(self.toppings):
результат = self.toppings[self.n]
self.n += 1
повернути результат
ще:
підняти StopIteration
# Давайте створимо піцу
my_pizza = Піца ('великий', ['пепероні', 'гриби', 'оливки'])
# А тепер давайте повторимо це
для начинки в my_pizza:
принт (доповнення)
У цьому випадку викликається цикл for __iter__
, який ініціалізує лічильник (self.n)
і повертає сам об’єкт піци (self)
.
Потім викликається цикл for __next__
щоб отримати кожну начинку по черзі.
Quando __next__
повернув усі приправи, StopIteration
він створює виняток, і цикл for тепер знає, що доповнень більше немає, і тому перериває процес ітерації.
Ercole Palmeri
Reply оголошує про запуск MLFRAME Reply, нової генеративної структури штучного інтелекту для різнорідних баз знань. Розроблено…
Нагорода IMSA для молодих стартапів, які народилися в результаті досліджень в університетах та…
Премія Zayed Award for Sustainability — це всесвітня нагорода ОАЕ за сталий розвиток і гуманітарну відданість.…
Reply, глобальний консультант і системний інтегратор, а також постачальник хмарних керованих послуг Oracle, оголошує, що отримав…
MasterZ Blockchain підвищує цінність для найбільшого WEB 3.0 Master of excellence в Європі. Повністю італійська команда…
33 фіналісти, обрані з 5.213 заявок у 163 країнах. Фіналісти виступають за ефективні кліматичні заходи та підтримують доступ до чистої енергії,…
Біологічні препарати виникли як інноваційний фармацевтичний клас, який революціонізував галузь медицини завдяки таргетній терапії. ДО…
Інсорсинг принтерів для виробництва металів і полімерів на заводах у Ріомі, Франція та Рок-Хілл, Кароліна…
Аналіз даних без використання бібліотеки за допомогою машинного навчання за допомогою Spectronaut ® 18 забезпечує найкращі в галузі кількісне визначення білка та продуктивність…
Mattermost має розширену екосистему союзників з акцентом на нові варіанти використання рішень Міністерством оборони…