Рубрики
Без рубрики

Dunder/Magic методы в Python

Методы Dunder – это имена, которым предшествуют и преуспевают в двойных подставках, отсюда и название … Tagged с помощью Python, программирования, учебника, Codenewbie.

Методы Dunder – это имена, которым предшествуют и преуспевают с двойными подчеркиваниями, отсюда и название Dunder. Они также называются магическими методами и могут помочь переопределить функциональность для встроенных функций для пользовательских классов.

1. Вступление

Реализация методов Dunder для классов является хорошей формой полиморфизма. Если вы когда -либо создавали класс в Python и использовали функцию init, то вы уже использовали методы Dunder.

2. Оглавление

1. Вступление

2. Оглавление

3. Предварительные условия

4. Зачем нам нужны методы Dunder?

5. Наш пользовательский класс

6. Дандер методы для нашего класса

7. Еще несколько методов души

8. Вывод

3. Предварительные условия

Прежде чем мы продолжим, будет важно иметь следующее:

  • Основное понимание объектно -ориентированного программирования с использованием Python.
  • Опыт работы с занятиями в Python.
  • Знакомство со встроенными функциями, такими как Len, Get, Set и т. Д.

4. Зачем нам нужны методы Dunder?

Рассмотрим случай, когда у нас есть следующий класс:

class point:
x = 4
y = 5
p1 = point()
print(p1)

Заявление печати будет распечатать что -то вроде <__ Main __. Point Object AT 0x7FB992998D00> Анкет Но мы могли бы хотеть, чтобы утверждение печати отображалась в формате (4,10) . Мы можем достичь этого, переопределив __str__ Метод нашего класса.

Мы также могли бы переопределить другие методы, такие как Лен, +, [] и т. д. Мы создадим новый класс и переопределим многие встроенные функции в этой статье.

5. Наш пользовательский класс

class softwares:
names = []
versions = {}

Этот класс будет использоваться для сохранения списка программного обеспечения и их версий. имена это список для хранения названий программного обеспечения и версии это словарь, где ключ – это имя программного обеспечения, а значение – номер версии. По умолчанию все программные материалы начинаются с версии 1.

6. Дандер методы для нашего класса

Прежде чем двигаться дальше, убедитесь, что ваше отступление верно. Методы, которые будут обсуждаться ниже, представляют собой методы, принадлежащие к созданному нами классу, и должны быть отступают надлежащим образом.

6.1. в этом

Это метод, который вы уже использовали, если вы работали с классами. init Метод используется для создания экземпляра класса.

def __init__(self,names):
if names:
self.names = names.copy()
for name in names:
self.versions[name] = 1
else:
raise Exception("Please Enter the names")

init Метод, определенный выше, принимает список имен в виде параметров и хранит его в классе ‘ имена список. Кроме того, это также населяет версии Словарь. Мы также поместили чек на имена список.

Если список пуст, исключение поднимается. Ниже мы будем использовать init метод

p = softwares(['S1','S2','S3'])
p1 = softwares([])

Первое утверждение будет работать нормально, но вторая строка поднимет исключение, так как пустой список был принят в качестве параметра.

6.2. стр

str Метод полезен, когда мы хотим использовать экземпляры нашего класса в печатном порядке. Как обсуждалось ранее, он обычно возвращает объект памяти. Но мы можем переопределить str метод для удовлетворения наших требований.

def __str__(self):
s ="The current softwares and their versions are listed below: \n"
for key,value in self.versions.items():
s+= f"{key} : v{value} \n"
return s

Вышеупомянутое str Метод возвращает программное обеспечение и их версии. Убедитесь, что функция возвращает строку. Ниже мы бы назвали метод.

print(p)

6.3. setItem

При назначении значений в словаре setItem метод вызывается.

d = {}
d['key'] = value

Мы можем дать экземпляры нашего класса A аналогичной функции с помощью setItem метод

def __setitem__(self,name,version):
if name in self.versions:
self.versions[name] = version
else:
raise Exception("Software Name doesn't exist")

Приведенный выше метод обновит номер версии программного обеспечения. Если программное обеспечение не найдено, оно вынесет ошибку.

В 3-й строке мы используем встроенный setItem Метод словаря.

Мы можем вызвать setItem метод следующим образом:

p['S1'] = 2
p['2'] = 2

Первая строка обновила бы версию программного обеспечения S1 до 2. Но вторая строка поднимет исключение, поскольку программного обеспечения 2 не существует.

6.4. getitem

getItem Метод похож на setItem Метод, основное отличие заключается в том, что getItem Метод вызывается, когда мы используем [] оператор словаря.

d = {'val':key}
print(d['val'])

Экземпляры нашего класса также могут быть даны аналогичной особенностью.

def __getitem__(self,name):
if name in self.versions:
return self.versions[name]
else:
raise Exception("Software Name doesn't exist")

Приведенный выше метод по существу возвращает версию программного обеспечения. Если программное обеспечение не найдено, оно поднимает исключение. Вызвать getItem Метод, мы можем написать следующую строку кода.

print(p['S1'])
print(p['1'])

Первая строка будет распечатать версию S1. Но вторая строка поднимет исключение, так как 1 не существует.

6.5. Delitem

Delitem как setItem и getItem метод Чтобы избежать повторения, мы перейдем к варианту реализации и использования.

def __delitem__(self,name):
if name in self.versions:
del self.versions[name]
self.names.remove(name)
else:
raise Exception("Software Name doesn't exist")

Delitem Метод удаляет программное обеспечение из словаря, а также список.

Это может быть использовано следующим образом.

del p['S1']

6.6. Лен

В словаре Лен Метод возвращает количество элементов в списке или количество пар клавишных значений в словаре.

Мы можем определить Лен Метод для нашего класса.

def __len__(self):
return len(self.names)

Лен Метод для нашего класса возвращает количество программ. Как вы могли заметить, мы используем встроенный Лен Метод списка, чтобы вернуть количество программного обеспечения.

Лен Метод нашего класса может использоваться следующим образом.

print(len(p))

6.7. содержит

содержит Метод используется при использовании в оператор. Возвращающаяся стоимость должна быть логическим.

def __contains__(self,name):
if name in self.versions:
return True
else:
return False

Метод проверяет, найдено ли имя в словаре. Мы будем использовать встроенный словарь содержит Метод для этого.

if 'S2' in p:
print("Software Exists")
else:
print("Software DOESN'T exist")

Приведенный выше код печатает оператор внутри блоков IF, так как программное обеспечение S2 присутствует внутри версии Словарь.

6.8. Полный код

class softwares:
names = []
versions = {}

def __init__(self,names):
if names:
self.names = names.copy()
for name in names:
self.versions[name] = 1
else:
raise Exception("Please Enter the names")

def __str__(self):
s ="The current softwares and their versions are listed below: \n"
for key,value in self.versions.items():
s+= f"{key} : v{value} \n"
return s

def __setitem__(self,name,version):
if name in self.versions:
self.versions[name] = version
else:
raise Exception("Software Name doesn't exist")

def __getitem__(self,name):
if name in self.versions:
return self.versions[name]
else:
raise Exception("Software Name doesn't exist")

def __delitem__(self,name):
if name in self.versions:
del self.versions[name]
self.names.remove(name)
else:
raise Exception("Software Name doesn't exist")

def __len__(self):
return len(self.names)

def __contains__(self,name):
if name in self.versions:
return True
else:
return False

7. Еще несколько методов души

Прежде чем смотреть на еще несколько методов Dunder, давайте создадим новый класс.

class point:
x = None
y = None

def __init__(self, x , y):
self.x = x
self.y = y

def __str__(self):
s = f'({self.x},{self.y})'
return s
p1 = point(5,4)
p2 = point(2,3)

Мы создали классную точку, которая в основном является 2D -точкой. У класса есть init Метод и str метод Мы также создали пару случаев класса.

7.1. добавлять

Добавить Метод вызывается при использовании + оператор. Мы можем определить обычай Добавить Метод для нашего класса.

P1 + P2 равен p1._add __ (P2)

def __add__(self,p2):
x = self.x + p2.x
y = self.y + p2.y
return point(x,y)

Приведенный выше метод добавляет координаты x и y первого экземпляра точка и второй экземпляр точка Анкет Это создаст новый экземпляр точка а затем вернуть его.

p3 = p1 + p2

Строка кода выше вызывает Добавить метод

7.2. я добавить

iadd Метод похож на Добавить метод Это вызывается при использовании += оператор

def __iadd__(self,p2):
self.x += p2.x
self.y += p2.y
return self

Приведенный выше метод просто обновляет координаты экземпляра, добавив координаты P2 Анкет Убедитесь, что вы возвращаетесь себя , в противном случае он не вернет ни одного и не будет работать, как и ожидалось.

p1 += p2
print(p1)

Приведенный выше метод вызывает iadd метод

7.3. Другие операторы

  • __sub __ (Self, P2) ( – )
  • __isub __ (Self, P2) ( -= )
  • __mul __ (self, p2) ( * )
  • __imul __ (Self, P2) ( *= )
  • __truediv __ (Self, P2) ( \ )
  • __itruediv __ (self, p2) ( \= )
  • __floordiv __ (Self, P2) ( \\ )
  • __ifloordiv __ (self, p2) ( \= )

7.4. вызов

При вызове функции, подобной func () , мы вызываем Позвоните метод

Если мы поставим в место Позвоните Метод для нашего класса, мы можем сделать следующее:

p1()
p2()

Ниже приведен пример метода вызова:

def __call__(self):
print(f"Called Point {self.x},{self.y}")

7.5. Полный код

class point:
x = None
y = None

def __init__(self, x , y):
self.x = x
self.y = y

def __str__(self):
s = f'({self.x},{self.y})'
return s

def __add__(self,p2):
print("In add")
x = self.x + p2.x
y = self.y + p2.y
return point(x,y)

def __iadd__(self,p2):
self.x += p2.x
self.y += p2.y
return self

def __isub__(self,p2):
self.x -= p2.x
self.y -= p2.y
return self

def __imul__(self,p2):
self.x *= p2.x
self.y *= p2.y
return self

def __itruediv__(self,p2):
self.x /= p2.x
self.y /= p2.y
return self

def __ifloordiv__(self,p2):
self.x //= p2.x
self.y //= p2.y
return self

def __call__(self):
print(f"Called Point {self.x},{self.y}")

8. Вывод

Методы Dunder действительно волшебны и могут помочь вам улучшить функциональность вашего класса. Они могут помочь вам настроить ваши занятия и переопределить встроенные методы. Хотя мы обсудили некоторые из наиболее распространенных методов Дандер, существует больше методов Дандера, таких как хэш которые действительно полезны. хэш используется для добавления алгоритма хэширования в ваш класс. Это позволяет использовать объекты вашего класса в качестве ключей в словаре и иметь время поиска O (1). Вы можете найти больше о хэш и другие методы Dunder Здесь Анкет

Счастливого обучения!  🙂

Оригинал: “https://dev.to/rahulbanerjee99/dunder-magic-methods-in-python-15mi”