@staticmethod vs @classmethod in Python

Tural Muradov
3 min readJan 29, 2020

AzerbaijanPUG/Dev qrupu adından.

Yeni başlayanların ən çox anlamadığı və ya işləmə metodikasını başa düşmədiyi mövzulardan biridə python dilində class-ların @staticmethod və @classmethod dekoratorlarıdır. Dekoratorlar haqqında öz ana dilimizdə ətraflı bu linkdən oxuya bilərsiniz.

@staticmethod

Static metodlar class-ın nə obyektindən,nə onun property-lərindən nədəki metodlarından asılı olmayan sərbəst bir metoddur. Ümumilikdə statik metodlar class-ın obyektindən yox bir başa class-ın özündən asılıdır və obyektlərinin vəziyyətindən asılı olmur. Qısası class-ın heç bir törəməsindən asılı deyil. Static metodların class barədə hec bir anlayışı olmur, yalnız öz arqumentlərindən xəbəri olur. Static metodların işlənmə yerləri çoxda geniş olmasada məna baxımından class-ın gördüyü işə yaxın olan köməkçi metodları onunla yazmaq daha məqsədə uyğundur. Qısa kod nümunələrini aşagıdakı linkdə yerləşdirdim.

Yuxarıdakı nümunədən də göründüyü kimi static metodların classin hec bir törəməsi ilə əlaqesi yoxdur (print funksiyasının nəticələrinə baxın).

@classmethod

classmethod-da staticmethod kimi class-ın obyektinə yox , class-ın özunə bağlı olur. Classmethod class-ın özü ilə işləyir,ona görədə birinci arqument kimi class-ın (cls) özü qəbul olunur . Bu dekorator daha cox Fabrika metodu adlanır (Factory methods o metodlardır ki, class-ın öz obyektini qaytarır). Class-ın konstruktorunu da (constructor) Fabrika metodu adlandırmaq olar. Qısa kod nümunələrini aşagıdakı linkdə yerləşdirdim.

Gördüyümüz kimi pythonun isinstance metodu gösterir ki, statik metodla qaytarılan string-lər CustomString class-nın törəməsi deyil, amma classmethod-la yaradılan string-lər isə True nəticə qaytarır. Burdan belə qənaətə gəlmək olar ki, obyekt CustomString class-dan törənib. Static metod kimi yaratdığımız custom_title metodu @classmethod — un daxilində də köməkçi vasitə kimi istifadə etmişik.

Bəlkə daha real proyektdə işlədilən bir misala baxaq? ☺️

Deməli, təsəvvür edək ki, Flask micro web frameworkSQLAlchemy istifadə edərək xırda bir CRUD yazdım(Kodun başa düşülməsi üçün ayrı fayllara bölmədim). Kod parçasina aşagıdakı linkdən baxa bilərsiz.

CRUD class-na nəzər yetirsək görərik ki, bir neçə @classmethod istifadə edilir. Gəlin ilk öncə create metoduna nəzər yetirək. Niyə classmethod istifadə olunub? Ona görəki adi halda biz db-dəki cədvələ məlumat ötürdüyümüz zaman gərək hər zaman həmin modelin obyektini yaradaq və bir-bir user-in məlumatlarını daxil edək. Daha sonra isə save ve commit metodları vasitəsi ilə, məlumatları db-yə yazaq. Ancaq classmethodun köməkliyi ilə biz bu problemi aradan qaldırırıq. Üstəlik id dəyişənini də yoxlayırıq, olmadığı halda əlavə edirik. Biz classmethod istifadə etdiyimizə görə çağrıldığı class-ı, arqument kimi ötürdüyünə görə heç bir yoxlanışa ehtiyac qalmır. Ötürülən məlumatlar həmin modelə uyğun yerləşdirilir. Keçək digər classmetodlara, filter_first və query_all. Digər classmethod-da olduğu kimi bu halda da biz bu metodları çağırdığımız modelə uyğun olaraq query-i hazırlanır. SqlAlchemy-inin session.query() metodu query-i hazırlamaq üçün model ötürülməsini tələb edir. Bu zaman köməyimizə @classmethod dekoratoru gəlir. Bu bizə imkan verir ki, əlavə kod yazmayaraq modellərimizdən bir başa bu metoda müraciət edək. Müraciət zamanı classmethod özu çağrılan class-ı birinci arqument kimi ötürür və biz ona görə query hazırlayıb icra edirik.

İndi isə yuxarıda göstərdiyimiz kodun classmethod-suz yazılışına aşağıdakı linkdən baxaq.

Koda nəzər yetirsək nə qədər artıq kod yazıldığını görmək olar. Həmin hissələri kodda şərhlərlə göstərilib.

Qeyd

Yuxarıdakı kodlar tam işlək deyil. Real proyektdən bir hissələrdi sadəcə.

Nəticə

Oxşarlıqları:

1) Hər ikisi class metodudur.

2) Hər ikisini class-ın obyektindən yox class-in özündən çağırmaq olur.

Fərqləri:

1) @staticmethod class-la heç bir əlaqəsi yoxdur yalnız köməkçidir.

2) @classmethod class-in obyektini qaytarır bizə və class-ın obyekti ilə işləyir.

Extra

Class-da tez-tez rast gəlinən self və cls dəyişən adları heç bir məna kəsb etmir, siz onları istəyinizə uyğun olaraq dəyişə bilərsiz , vacib deyil (amma bunu etmeyin ☺️). self və cls dəyişən adları proqramçılar arasında kodu oxuduqda anlaşıqlı və aydın olması üçün işlədilir (Best Practices).

Yararlı linklər

--

--