9.1 type() funksiyası
Python-da obyektlərin tiplərini və siniflərini yoxlamaq üçün bir neçə daxili funksiya var. Bu funksiyalar müxtəlif məlumat tipləri ilə işləyə bilən çevik və təhlükəsiz kod yazmaq üçün çox faydalıdır.
Aşağıda onların ən populyarlarından danışacam: type(), isinstance(), issubclass(), həmçinin getattr() və hasattr() kimi tip annotasiyası üçün funksiyalar.
type() funksiyası
type() funksiyası obyektin tipini qaytarır. Yəqin artıq onunla işləməsiz, elə deyilmi?
x = 10
print(type(x)) # Output: <class 'int'>
Amma bəlkə də bilmirdiniz ki, onun köməyi ilə yeni siniflər yaratmaq da olar!
Yeni sinifin yaradılması
Əgər ona üç arqument ötürsəniz, o, yeni tip (sinif) yaradacaq.
Bu əməliyyatın siqnatürası:
type(name, bases, dict)
burada:
-
name— yaradılan sinifin adı (sətir). -
bases— yeni sinifin miras aldığı valideyn siniflərin korteci. -
dict— yeni sinifin atribut və metodlarını ehtiva edən lüğət.
Sadə bir sinifin yaradılması:
MyClass = type('MyClass', (), {'say_hello': lambda self: print("Salam!")})
# Sinifin instansiyasını yaradırıq
instance = MyClass()
instance.say_hello() # Output: Salam!
Hətta bir az mürəkkəb bir şey yaratmaq da olar:
MyClass = type('MyClass', (), {
'attribute': 42,
'__init__': lambda self, value: setattr(self, 'value', value),
'display_value': lambda self: print(self.value)
})
# Sinifin instansiyasını yaradırıq
instance = MyClass(10)
print(instance.attribute) # Output: 42
instance.display_value() # Output: 10
Beləliklə, indi siz təkcə obyektin tipini müəyyənləşdirə bilməzsiniz, həm də sinif yarada, ona obyektlər əlavə edə və sonra onların tiplərini müəyyənləşdirə bilərsiniz.
9.2 isinstance() funksiyası
isinstance() funksiyası Python-da daxili funksiyadır və obyektin müəyyən sinfə və ya siniflər tuple-ına aid olub-olmamasını yoxlamaq üçün istifadə olunur. Əgər obyekt göstərilən sinfin nümunəsidirsə və ya hansısa göstərilən siniflərdən biridir tuple-da, onda bu funksiya True qaytarır, əks halda isə False.
İmza və parametrlər:
isinstance(object, classinfo)
burada:
-
object— obyekt, hansı sinfə və ya siniflərə aid olduğunu yoxlamaq istəyirik. -
classinfo— sinif, tip və ya obyektin yoxlanılacağı siniflər və tiplər tuple-ı.
İstifadə nümunələri:
Tək sinfə aidiyyətin yoxlanılması
x = 10
print(isinstance(x, int)) # Nəticə: True
y = "Salam"
print(isinstance(y, str)) # Nəticə: True
Bircə siniflərdən birinə aidiyyətin yoxlanılması:
x = 10
print(isinstance(x, (int, float))) # Nəticə: True
y = "Salam"
print(isinstance(y, (int, str))) # Nəticə: True
z = 3.14
print(isinstance(z, (int, str))) # Nəticə: False
İstifadəçi tərəfindən yaradılmış siniflərin yoxlanılması
class Animal:
pass
class Dog(Animal):
pass
dog = Dog()
print(isinstance(dog, Dog)) # Nəticə: True
print(isinstance(dog, Animal)) # Nəticə: True
type()-dən birbaşa müqayisə istifadə etmək əvəzində isinstance() irsilikdə düzgün işləyir, obyektin sinif iyerarxiyasında hər hansı bir sinfə aid olub-olmadığını yoxlayır.
9.3 issubclass() funksiyası
issubclass() funksiyası, Python-da daxili bir funksiya olaraq istifadə olunur ki, verilmiş bir sinfin başqa bir sinfin və ya tuple içərisindəki siniflərdən birinin sub-sinfi olub olmadığını yoxlasın. Bu funksiya, əgər birinci arqument həqiqətən ikinci arqumentin sub-sinfi olarsa, True qaytarır, əks halda isə False.
Sintaksis və parametrlər:
issubclass(class, classinfo)
burada:
-
class— hansının ki, digər sinfə aid olub-olmamasını yoxlamalıyıq. -
classinfo— sinif, tip və ya siniflər və tiplərdən ibarət bir tuple, hansı ki, birinci arqumentin yoxlanacağı kriteriyadır.
İstifadə nümunələri:
Bir sinfə aidliyi yoxlamaq
class Animal:
pass
class Dog(Animal):
pass
print(issubclass(Dog, Animal)) # Çıxış: True
print(issubclass(Animal, Dog)) # Çıxış: False
Birdən artıq sinfə aidliyi yoxlamaq — heç olmasa birinə:
class Animal:
pass
class Dog(Animal):
pass
class Cat(Animal):
pass
print(issubclass(Dog, (Animal, Cat))) # Çıxış: True
print(issubclass(Dog, (Cat,))) # Çıxış: False
İstifadəçi sinifləri ilə nümunələr
Daxili siniflərdən miras almaq
class MyInt(int):
pass
print(issubclass(MyInt, int)) # Çıxış: True
print(issubclass(int, MyInt)) # Çıxış: False
Mirasalma iyerarxiyası
class A:
pass
class B(A):
pass
class C(B):
pass
print(issubclass(C, A)) # Çıxış: True
print(issubclass(C, B)) # Çıxış: True
print(issubclass(B, A)) # Çıxış: True
print(issubclass(A, C)) # Çıxış: False
issubclass() funksiyasının üstünlükləri
Sinif iyerarxiyasını yoxlamaq: issubclass(), sinif iyerarxiyasını yoxlamaq üçün istifadə oluna bilər ki, bu da kodun düzgün quruluşunu və miraslama prosesini təmin etməyə kömək edir.
Çeviklik: Funksiya həm tək bir sinfi, həm də siniflərdən ibarət bir tuple yoxlamağı dəstəkləyir, bu isə müxtəlif ssenarilər üçün çevik istifadəyə imkan verir.
Metaproqramlaşdırma üçün rahatlıq: issubclass() metaproqramlaşdırmada və dinamik tiplər və siniflər ilə işləyən kod yazarkən tez-tez istifadə olunur. Bu barədə hələ çox danışacağıq :)
GO TO FULL VERSION