Фино подесите понашање ваших класа помоћу Питхон-овог флексибилног механизма за надјачавање.

У Питхон-у, класе пружају чиста средства за спајање података и функционалности у елементе за вишекратну употребу. Креирање прилагођених класа вам омогућава да моделујете ентитете из стварног света као што су корисници, производи и запослени.

Питхон класе дефинишу магичне методе које можете прилагодити да бисте могли да обликујете понашање ваших класа за јединствене ситуације.

Разумевање магијских метода

Замислите магичне методе, које се још називају и дундер методе, као тајне чаролије или скривене песме које Питхон аутоматски позива када извршите одређене радње на објекту.

Питхон пружа много уграђеног понашања за класе кроз методе инстанце, статичке и класе. Можете креирати Питхон класе, и додатно их прилагодите помоћу магијских метода.

Магичне методе су методе инстанце у Питхон-у које имају две доње црте (__метод__) пре и после назива методе.

Ове посебне методе дају упутства Пајтону о томе како да рукује објектима класе. Ево неких најчешће коришћених магијских метода у Питхон класама:

instagram viewer
  • __гт__: Овај метод проверава да ли је један објекат већи од другог.
  • __у томе__: Овај метод се покреће када креирате инстанцу класе и углавном је за иницијализацију атрибута.
  • __стр__: Ово враћа стринг репрезентацију класе која описује објекат.
  • __репр__: Овај метод даје излаз који вам омогућава да поново креирате објекат користећи евал().
  • __лен__: Када користите лен() функција на објекту овај метод враћа дужину објекта.
  • __ек__: Овај метод омогућава поређење између објеката користећи двоструко једнако (==) оператор.
  • __лт__: Имплементира мање од (
  • __додати__: Када користите додатак (+) оператор на објектима који овај метод покреће и извршава операције сабирања.
  • __гетитем__: Омогућава вам да преузмете ставке из објекта користећи синтаксу индекса, нпр обј[кључ].

Примена магијских метода

Најбољи начин да разумете магијске методе је да их користите.

Стринг Репрезентација објекта

Можете прилагодити стринг репрезентацију објекта за читљивост или даљу обраду.

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

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

Овде имате једноставну Особа разред са ан __у томе__ магични метод да га иницијализујете. Када одштампате п1 објекат, користи подразумевану репрезентацију стрингова коју обезбеђује Питхон.

Да бисте прилагодили приказ стрингова, дефинишите __стр__ и __репр__ магичне методе:

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)

Сада имате читљивију и свеобухватнију репрезентацију стрингова п1 објекат:

Својство дужине објекта

Замислите то када позовете лен() методом Персон објекта, желите њихову висину. Имплементирајте __лен__ магијски метод за Особа класа:

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))

Тхе __лен__ магични метод враћа атрибут висине а Особа инстанце. Када позовеш лен (п2), то ће позвати __лен__ магични метод аутоматски који враћа висину п2 објекат.

Руковање поређењем између објеката

Ако треба да упоредите објекте класе на основу одређених својстава класе. Можете дефинисати __ек__ магични метод и примените своју логику поређења.

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)

Тхе __ек__ метод упоређује име и старости атрибути њих двоје Персон'с предмета за утврђивање једнакости.

Двоструки једнак (==) оператор користи овај метод за проверу једнакости уместо да упоређује идентитете. Дакле два Особа инстанце су једнаке ако имају одговарајуће атрибуте имена и старости. Ово вам омогућава да заобиђете подразумевано понашање провере једнакости за вашу прилагођену класу.

Применом ових магичних метода, можете дефинисати прилагођено понашање које ће бити у складу са уграђеним Питхон-овима.

Напредне магијске методе

Ево неколико напредних примера коришћења магичних метода за прилагођавање класа.

Нека се класе понашају као контејнери

Користећи магичне методе можете дефинисати класе које се понашају као контејнери. Можете користити контејнери, попут торки, за чување колекција елемената података. Они пружају различите методе за манипулацију, приступ и понављање кроз садржане елементе.

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

Сада се објекат Персон може понашати као контејнер:

Прилагођавање приступа атрибутима

Помоћу __гетаттр__ магичном методом можете прилагодити начин атрибута Особа разреду се приступа на основу одређених услова.

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

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

Тхе __гетаттр__ метода ће се покренути када покушате да приступите атрибуту који не постоји директно у објекту. У овом случају, проверава да ли је име атрибута старости и враћа 40.

За било које друго име атрибута, подиже ан АттрибутеЕррор са одговарајућом поруком.

Омогућавање да се класе понашају као да се могу позивати

Тхе __позови__ метода вам омогућава да третирате инстанцу класе као објекат који се може позвати (тј. функцију).

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)

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

Тхе Вецтор класа дефинише __додати__ метод, који се покреће када користите + оператор између две инстанце класе. Метод додаје одговарајуће компоненте два вектора и враћа нови Вецтор пример са резултатом.

Овде сте видели основне магичне методе које можете применити да бисте прилагодили понашање ваше класе. Питхон има много више магичних метода које нуде већу флексибилност приликом креирања класа. Односи се званична документација за комплетну листу.

Објектно оријентисано програмирање у Питхон-у

Магичне методе у Питхон-у пружају моћне начине за прилагођавање и побољшање понашања класа. Магичне методе иду уз концепт објектно оријентисаног програмирања (ООП) у Питхон-у. Зато је важно разумети концепт ООП-а када покушавате да користите магичне методе.