Настройте фино поведението на вашите класове с гъвкавия механизъм за замяна на Python.

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

Класовете на Python дефинират магически методи, които можете да персонализирате, за да ви позволят да оформите поведението на вашите класове за уникални ситуации.

Разбиране на магическите методи

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

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

Магическите методи са методи на екземпляри в Python, които имат две долни черти (__метод__) преди и след името на метода.

instagram viewer

Тези специални методи дават инструкции на Python как да обработва обекти от даден клас. Ето някои често използвани магически методи в класовете на Python:

  • __gt__: Този метод проверява дали един обект е по-голям от друг.
  • __в него__: Този метод се изпълнява, когато създавате екземпляр на клас и е главно за инициализация на атрибути.
  • __str__: Това връща низово представяне на класа, описващ обекта.
  • __repr__: Този метод дава изход, който ви позволява да пресъздадете обекта, използвайки оценка ().
  • __len__: Когато използвате len() функция върху обект този метод връща дължината на обекта.
  • __eq__: Този метод позволява сравнение между обекти, използвайки двойното, равно на (==) оператор.
  • __lt__: Прилага по-малко от (
  • __добави__: Когато използвате добавката (+) върху обекти, този метод се изпълнява и извършва операции за добавяне.
  • __getitem__: Позволява ви да извличате елементи от обект, използвайки синтаксис на индекс, като obj[ключ].

Прилагане на магически методи

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

Низово представяне на обект

Можете да персонализирате низовото представяне на обект за четливост или допълнителна обработка.

classPerson:
def__init__(self, name, age):
self.name = name
self.age = age

p1 = Person('John', 25)
print(p1)

Тук имате просто Лице клас с ан __в него__ магически метод за инициализиране. Когато отпечатате p1 обект, той използва низовото представяне по подразбиране, предоставено от Python.

За да персонализирате представянето на низ, дефинирайте __str__ и __repr__ магически методи:

classPerson:
def__init__(self, name, age, height):
self.name = name
self.age = age
self.height = height

def__str__(self):
returnf'{self.name} is {self.age} years old'

def__repr__(self):
returnf'{self.name} is {self.age} years old'

p1 = Person('John', 25, 78)
print(p1)

Сега имате по-разбираемо и изчерпателно низово представяне на p1 обект:

Свойство Length на обект

Представете си, че когато се обадите на len() метод на обект Person, искате тяхната височина. Прилагане на __len__ магически метод за Лице клас:

classPerson:
def__init__(self, name, age, height):
self.name = name
self.age = age
self.height = height

def__str__(self):
returnf'{self.name} is {self.age} years old'

def__repr__(self):
returnf'{self.name} is {self.age} years old'

def__len__(self):
return self.height

p2 = Person('Issac', 25, 89)
print(len(p2))

The __len__ магически метод връща атрибута височина на a Лице инстанция. Когато се обадите леща (p2), ще извика __len__ магически метод, който автоматично връща височината на p2 обект.

Работа със сравнение между обекти

Ако трябва да сравните обекти от клас въз основа на определени свойства на класа. Можете да определите __eq__ магически метод и приложете вашата логика за сравнение.

classPerson:

def__init__(self, name, age, height):
self.name = name
self.age = age
self.height = height

def__str__(self):
returnf'{self.name} is {self.age} years old'

def__repr__(self):
returnf'{self.name} is {self.age} years old'

def__len__(self):
return self.height

def__eq__(self, other):
return self.name == other.name and self.age == other.age

p1 = Person('John', 25, 56)
p2 = Person('John', 25, 61)

print(p1 == p2)

The __eq__ методът сравнява име и възраст атрибути на двете На човек обекти за определяне на равенството.

Двойното равно на (==) операторът използва този метод, за да провери за равенство, вместо да сравнява идентичности. Значи две Лице екземплярите са равни, ако имат съвпадащи атрибути име и възраст. Това ви позволява да замените поведението за проверка на равенството по подразбиране за вашия персонализиран клас.

Чрез прилагането на тези магически методи можете да дефинирате персонализирано поведение, което ще бъде в съответствие с вградените функции на Python.

Разширени магически методи

Ето някои усъвършенствани примери за използване на магически методи за персонализиране на класове.

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

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

classPerson:
def__init__(self):
self.data = []

def__len__(self):
return len(self.data)

def__getitem__(self, index):
return self.data[index]

def__setitem__(self, index, value):
self.data[index] = value

def__delitem__(self, index):
del self.data[index]

p1 = Person()
p1.data = [10, 2, 7]
print(len(p1)) # 3

p1[0] = 5
print(p1[0]) # 5

Сега обект Person може да се държи като контейнер:

Персонализиране на достъпа до атрибути

Използвайки __getattr__ магически метод можете да персонализирате начина, по който атрибутите на Лице клас се осъществява достъп въз основа на определени условия.

classPerson:
def__getattr__(self, name):
if name == 'age':
return40
else:
raise AttributeError(f'No attribute {name}')

p1 = Person()
print(p1.age) # 40

The __getattr__ ще се изпълнява, когато се опитате да получите достъп до атрибут, който не съществува директно в обекта. В този случай той проверява дали името на атрибута е възраст и връща 40.

За всяко друго име на атрибут, той повдига an AttributeError със съответното съобщение.

Направете класовете да се държат като Callable

The __обадете се__ метод ви позволява да третирате екземпляр на класа като извикващ се обект (т.е. функция).

classAdder:
def__call__(self, x, y):
return x + y

adder = Adder()
print(adder(2, 3)) # 5

Когато създадете екземпляр на Зъбора и след това го извикайте с аргументи, __обадете се__ методът се изпълнява и извършва събирането, преди да върне резултата.

Претоварване на оператора

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

classVector:
def__init__(self, x, y):
self.x = x
self.y = y

def__add__(self, other):
if isinstance(other, Vector):
new_x = self.x + other.x
new_y = self.y + other.y
return Vector(new_x, new_y)
else:
raise TypeError("Unsupported operand type for +")

def__str__(self):
returnf"({self.x}, {self.y})"

# Creating two Vector instances
v1 = Vector(2, 3)
v2 = Vector(1, 4)

# Adding two Vector instances using the + operator
v3 = v1 + v2

# Printing the result
print(v3) # Output: (3, 7)

Резултатът е нов вектор:

The вектор класът определя __добави__ метод, който се изпълнява, когато използвате + оператор между два екземпляра на класа. Методът добавя съответните компоненти на двата вектора и връща нов вектор инстанция с резултата.

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

Обектно-ориентирано програмиране в Python

Магическите методи в Python предоставят мощни начини за персонализиране и подобряване на поведението на класовете. Магическите методи вървят заедно с концепцията за обектно-ориентирано програмиране (ООП) в Python. Затова е важно да разберете концепцията на ООП, когато се опитвате да използвате магически методи.