Məqalələr

Daha yaxşı proqramlaşdırma üçün Python və qabaqcıl üsullar, dunder funksiyaları

Python fantastik proqramlaşdırma dilidir və bunu sübut edir Github, həm də 2022-ci ildə ikinci ən populyar dildir.

Python-un ən maraqlı üstünlükləri geniş proqramçılar icmasıdır.

Görünür, Python-un hər hansı bir istifadə halı üçün paketi var.

Python proqramlaşdırmasının geniş dünyasında, tez-tez yeni başlayanlar tərəfindən diqqətdən kənarda qalan, lakin dilin ekosistemində əhəmiyyətli əhəmiyyət kəsb edən bir sıra xüsusiyyətlər var.

Sehrli üsullar əvvəlcədən metodlar toplusudurdefiPython-da xüsusi sintaktik xüsusiyyətləri təmin edən nites. Onlar kimi başlanğıcda və sonunda qoşa tire ilə asanlıqla tanınırlar __init__, __call__, __len__ … və s.

Sehrli üsullar

Sehrli üsullar xüsusi obyektlərin daxili Python tiplərinə bənzər davranmasına imkan verir.

Bu yazıda biz güclü dunder funksiyalarına diqqət yetirəcəyik. Onların məqsədini araşdıracağıq və istifadəsini müzakirə edəcəyik.

İstər bir Python təcrübəsiz, istərsə də təcrübəli proqramçı olmağınızdan asılı olmayaraq, bu məqalə sizə Dunder funksiyalarını hərtərəfli başa düşməyi, Python kodlaşdırma təcrübənizi daha səmərəli və zövqlü etmək məqsədi daşıyır.

Unutmayın ki, Python-un sehri təkcə sadəliyində və çox yönlülüyündə deyil, həm də Dunder funksiyaları kimi güclü xüsusiyyətlərindədir.

__init__

Bəlkə də hamısının ən əsas dunder funksiyası. Bu, Python-un hər dəfə yeni obyekt yaratdıqda (və ya adından göründüyü kimi işə saldıqda) avtomatik olaraq çağırdığı sehrli üsuldur.__init__

Pizza sinifi:
def __init__ (özünü, ölçüsü, əlavələri):
self.size = ölçü
self.toppings = toppings

# İndi pizza yaradaq
my_pizza = Pizza('böyük', ['pepperoni', 'göbələk'])

print(my_pizza.size) # Bu çap edəcək: böyük
print(my_pizza.toppings) # Bu çap edəcək: ['pepperoni', 'göbələk']

Bu nümunədə Pizza adlı bir sinif yaradılmışdır. Biz __init__ funksiyamızı işə salma zamanı təyin ediləcək parametrləri daxil etmək üçün qurduq və onları xüsusi obyektimiz üçün xassələr kimi təyin etdik.

Burada sinifin nümunəsini təmsil etmək üçün istifadə olunur. Beləliklə, biz self.size = size yazanda deyirik: "Hey, bu pizza obyektinin atribut ölçüsü var. size, və mən obyekti yaradanda verdiyim ölçüdə olmasını istəyirəm”.

__str__ və __repr__

__Str__

Bu, bizə imkan verən Python-un sehrli üsuludur defibizim xüsusi maddə üçün təsviri nish.

Bir obyekti çap edərkən və ya istifadə edərək onu sətirə çevirdiyiniz zaman str(), Python ilə yoxlayın defiMən bir üsul tapdım __str__ həmin obyektin sinfi üçün.

Əgər belədirsə, obyekti sətirə çevirmək üçün bu üsuldan istifadə edin.

Biz Pizza nümunəmizi funksiya daxil etmək üçün genişləndirə bilərik __str__ aşağıdakı kimi:

sinif Pizza: def __init__(self, size, toppings): self.size = size self.toppings = toppings def __str__(self): return f"A {self.size} pizza ilə {', '.join(self.toppings) )}" my_pizza = Pizza('böyük', ['pepperoni', 'göbələk']) çap edin(my_pizza) # Bu çap edəcək: Pepperoni ilə böyük pizza, göbələk
__repr__

__str__ funksiyası daha çox obyektin xassələrini təsvir etmək üçün qeyri-rəsmi bir üsuldur. Digər tərəfdən, __repr__ xüsusi obyektin daha rəsmi, ətraflı və birmənalı təsvirini təmin etmək üçün istifadə olunur.

Zəng etsəniz repr() obyektdə və ya sadəcə obyektin adını konsola yazsanız, Python metod axtaracaq __repr__.

Se __str__ bu deyil definite, Python istifadə edəcək __repr__ obyekti çap etməyə və ya onu sətirə çevirməyə çalışarkən ehtiyat kimi. Buna görə də tez-tez yaxşı bir fikirdir defiheç olmasa bitir __repr__, olmasa belə defiçıxır __str__.

Budur necə edə bilərik defibitir __repr__ pizza nümunəmiz üçün:

Pizza sinifi:
def __init__ (özünü, ölçüsü, əlavələri):
self.size = ölçü
self.toppings = toppings

def __repr__(özünü):
qaytar f"Pizza('{self.size}', {self.toppings})"

my_pizza = Pizza('böyük', ['pepperoni', 'göbələk'])
print(repr(my_pizza)) # Bu çap edəcək: Pizza('böyük', ['pepperoni', 'göbələk'])

__repr__ sizə pizza obyektini yenidən yaratmaq üçün Python əmri kimi işlədə biləcəyiniz bir sətir verir, halbuki __str__ sizə daha insani təsvir verir. Ümid edirəm ki, bu, bu dunder üsullarını bir az daha yaxşı çeynəməyə kömək edəcək!

__əlavə etmək__

Python-da hamımız bilirik ki, operatordan istifadə edərək nömrələr əlavə etmək mümkündür +, kimi 3 + 5.

Bəs bəzi xüsusi obyektin nümunələrini əlavə etmək istəsək nə olacaq?

Dunder funksiyası __add__ bizə bunu etməyə imkan verir. Bizə imkan verir defioperatorun davranışını yoxlayın + şəxsi əşyalarımızda.

Ardıcıllıq baxımından, tutaq ki, istəyirik defidavranışını bitirmək + pizza nümunəmizdə. Deyək ki, biz iki və ya daha çox pizza əlavə etdikdə, o, avtomatik olaraq bütün əlavələri birləşdirəcək. Bunun necə görünə biləcəyi budur:

Pizza sinifi:
def __init__ (özünü, ölçüsü, əlavələri):
self.size = ölçü
self.toppings = toppings

def __add__ (özünü, başqasını):
deyilsə, məsələn (digər, Pizza):
TypeError ("Yalnız başqa Pizza əlavə edə bilərsiniz!")
new_toppings = self.toppings + other.toppings
qaytarın Pizza(self.size, new_toppings)

# İki pizza yaradaq
pizza1 = Pizza('böyük', ['pepperoni', 'göbələk'])
pizza2 = Pizza('böyük', ['zeytun', 'ananas'])

# İndi onları "əlavə edək"
birləşdirilmiş_pizza = pizza1 + pizza2

print(combined_pizza.toppings) # Bu çap olunacaq: ['pepperoni', 'göbələk', 'zeytun', 'ananas']

Dunder kimi __add__, biz də edə bilərik defikimi digər arifmetik funksiyaları bitirin __sub__ (operatordan istifadə edərək çıxma ilə -) Və __mul__ (operatordan istifadə edərək vurma üçün *).

__len__

Bu dunder üsulu bizə imkan verir definə funksiyasını bitirin len() bizim xüsusi maddələr üçün geri olmalıdır.

Python istifadə edir len() siyahı və ya sətir kimi məlumat strukturunun uzunluğunu və ya ölçüsünü əldə etmək üçün.

Nümunəmizin kontekstində deyə bilərik ki, pizzanın "uzunluğu" onun tərkibində olan əlavələrin sayıdır. Bunu necə həyata keçirə bilərik:

Pizza sinifi:
def __init__ (özünü, ölçüsü, əlavələri):
self.size = ölçü
self.toppings = toppings

def __len__(özünü):
qaytarma lenti(self.toppings)

# Bir pizza yaradaq
my_pizza = Pizza('böyük', ['pepperoni', 'göbələk', 'zeytun'])

print(len(my_pizza)) # Bu çap edəcək: 3

__len__ metodunda biz yalnız siyahının uzunluğunu qaytarırıq toppings. İndi, len(my_pizza) üzərində nə qədər yağ olduğunu bizə xəbər verəcəkdir my_pizza.

__prosedur__

Bu dunder metodu obyektlərin təkrarlanmasına imkan verir, yəni onu for döngəsində istifadə etmək olar.

Bunu etmək üçün biz də etməliyik defifunksiyanı bitirin __next__, Bu üçün istifadə olunur defiiterasiyada növbəti dəyəri qaytarmalı olan davranışı yoxlayın. O, həmçinin ardıcıllıqda artıq elementlərin olmadığı hadisədə təkrarlana biləni siqnal etməlidir. Biz adətən bir istisna atmaqla buna nail oluruq StopIteration.

Pizza nümunəmiz üçün deyək ki, biz əlavələri təkrarlamaq istəyirik. Pizza sinifimizi iterativ edə bilərik defibir üsuldur __iter__:

Pizza sinifi:
def __init__ (özünü, ölçüsü, əlavələri):
self.size = ölçü
self.toppings = toppings

def __iter__(özünü):
self.n = 0
özünə qayıt

def __next__(özünü):
əgər self.n < len(self.toppings):
nəticə = self.toppings[self.n]
self.n += 1
nəticəni qaytarın
başqa:
StopIteration artırın

# Bir pizza yaradaq
my_pizza = Pizza('böyük', ['pepperoni', 'göbələk', 'zeytun'])

# İndi isə onu təkrarlayaq
my_pizza-da doldurmaq üçün:
çap (üstü)

Bu halda, for loop çağırır __iter__, sayğacı işə salır (self.n) və pizza obyektinin özünü qaytarır (self).

Sonra for loop çağırır __next__ hər zirvəni növbə ilə almaq üçün.

Zaman __next__ bütün ədviyyatları qaytardı, StopIteration o, bir istisna atır və for loop indi bilir ki, artıq əlavələr yoxdur və buna görə də iterasiya prosesini dayandıracaq.

Ercole Palmeri

İnnovasiya bülleteni
Yeniliklərlə bağlı ən vacib xəbərləri qaçırmayın. Onları e-poçtla almaq üçün qeydiyyatdan keçin.
Tags: python

Articoli recenti

Veeam müdafiədən tutmuş cavab və bərpaya qədər ransomware üçün ən əhatəli dəstəyi təqdim edir

Coveware by Veeam kiber qəsb hallarına cavab xidmətləri göstərməyə davam edəcək. Coveware məhkəmə və remediasiya imkanları təklif edəcək...

23 Aprel 2024

Yaşıl və Rəqəmsal İnqilab: Proqnozlaşdırılan Baxım Neft və Qaz Sənayesini necə çevirir?

Proqnozlaşdırılan texniki xidmət zavodun idarə edilməsinə innovativ və proaktiv yanaşma ilə neft və qaz sektorunda inqilab edir.…

22 Aprel 2024

Böyük Britaniyanın antiinhisar tənzimləyicisi GenAI üzərində BigTech həyəcanını qaldırır

Böyük Britaniyanın CMA süni intellekt bazarında Big Tech-in davranışı ilə bağlı xəbərdarlıq edib. Orada…

18 Aprel 2024

Casa Green: İtaliyada davamlı gələcək üçün enerji inqilabı

Avropa İttifaqı tərəfindən binaların enerji səmərəliliyini artırmaq üçün tərtib edilən "Yaşıl Evlər" Fərmanı qanunvericilik prosesini yekunlaşdırdı ...

18 Aprel 2024