Статті

Python і розширені методи, більш зручні функції для кращого програмування

Python є фантастичною мовою програмування, і, як свідчать GitHub, також є другою за популярністю мовою у 2022 році.

Найцікавішими перевагами Python є велика спільнота програмістів.

Здається, Python має пакет для будь-якого випадку використання.

У величезному світі програмування на Python є набір функцій, які часто залишаються непоміченими початківцями, але мають важливе значення в екосистемі мови.

Магічні методи - це набір попередніх методівdefinites у Python, які надають спеціальні синтаксичні функції. Їх легко впізнати по подвійним тире на початку і в кінці, на кшталт __init__, __call__, __len__ … тощо

Магічні методи

Чарівні методи дозволяють настроюваним об’єктам поводитися подібно до вбудованих типів Python.

У цій статті ми зосередимося на потужних функціях dunder. Ми вивчимо їх призначення та обговоримо їх використання.

Незалежно від того, чи є ви новачком у Python, чи досвідченим програмістом, ця стаття має на меті надати вам повне розуміння функцій Dunder, що зробить ваш досвід кодування на Python більш ефективним і приємним.

Пам’ятайте, магія Python полягає не лише в його простоті та універсальності, але й у його потужних функціях, таких як функції Dunder.

__init__

Мабуть, найосновніша функція 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, і я хочу, щоб він був того розміру, який я вказав під час створення об’єкта».

__str__ і __repr__

__Str__

Це магічний метод 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__ (для множення за допомогою оператора *).

__len__

Цей метод 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

Інноваційний бюлетень
Не пропустіть найважливіші новини про інновації. Підпишіться, щоб отримувати їх електронною поштою.
Ключові слова: пітон

Читайте Innovation своєю мовою

Інноваційний бюлетень
Не пропустіть найважливіші новини про інновації. Підпишіться, щоб отримувати їх електронною поштою.

Слідуйте за нами

Останні статті