10.1 Hər şey mənim qaydamla olacaq!
Bəzən obyektlərinizdə şəbəkə üzərində ötürmək istəmədiyiniz və ya şəbəkə üzrə ötürülməsi mümkün olmayan çoxlu xidməti obyektlərə istinadlar saxlanılır: fayllara, verilənlər bazalarına və s.
Serializasiyanın bu hallarda işləməsi üçün, bir sinfə öz serializasiyasını idarə etmək imkanı verməyi düşünüblər. Bunun üçün xüsusi metodlardan istifadə edilir: __reduce__()
, __getstate__()
, __setstate__()
. Bu metodlar obyektlərin necə serializasiya olunub bərpa ediləcəyini göstərməyə imkan verir.
İdarə olunan serializasiyanın əsas metodları:
-
__reduce__()
: Obyektin necə serializasiya ediləcəyini göstərir. -
__getstate__()
: Serializasiya üçün obyektin vəziyyətini qaytarır. -
__setstate__(self, state)
: Obyektin vəziyyətdən bərpasını həyata keçirir.
Aşağıda bu metodlar haqqında daha ətraflı danışacağam və onları birlikdə necə istifadə etmək lazım olduğunu göstərəcəyəm.
10.2 __reduce__()
metodu
__reduce__()
metodu kortec qaytarır, hansı ki obyektin necə seriyalaşdırılmalı və deserializasiya edilməli olduğunu göstərir. Kortec adətən bunları ehtiva edir:
- Funksiya və ya sinfə istinadı, hansı ki obyektin bərpası üçün istifadə olunacaq.
- Bu funksiya və ya sinif üçün arqumentlər korteci.
- Əlavə obyektin vəziyyəti (əgər ehtiyac varsa).
Nümunə:
import pickle
class CustomClass:
def __init__(self, value):
self.value = value
def __reduce__(self):
return (self.__class__, (self.value,))
def __repr__(self):
return f"CustomClass(value={self.value})"
# Obyektin yaradılması
obj = CustomClass(42)
# Obyektin seriyalizasiyası
serialized_obj = pickle.dumps(obj)
print("Seriyalizasiya olunmuş obyekt:", serialized_obj)
# Obyektin deserializasiyası
deserialized_obj = pickle.loads(serialized_obj)
print("Deserializasiya olunmuş obyekt:", deserialized_obj)
Varsayılan olaraq __reduce__()
funksiyasının belə davranışı var:
class CustomClass:
def __init__(self, value):
self.value = value
def __reduce__(self):
# Sinifin təyin edilməsi
cls = self.__class__
# Konstruktorun arqumentləri
args = (self.value,)
# Obyektin vəziyyəti
state = self.__dict__
return (cls, args, state)
O, üç obyekt korteci qaytarır:
Cari sinifə istinad
Konstruktorun arqumentləri (kortec)
Cari obyektin vəziyyətinə istinad
Əgər belə davranış sizi qane edirsə — __reduce__()
metodunu yenidən yazmağa ehtiyac yoxdur.
10.3 Oxumaq və vəziyyətin yazılması
__getstate__()
və __setstate__()
metodları
Bu metodlar obyektin vəziyyətini serializasiya və deserializasiya zamanı idarə etmək üçün istifadə olunur.
-
__getstate__()
: Serializasiya edilməli olan obyektin vəziyyətini qaytarır. -
__setstate__(self, state)
: Vəziyyətdən obyekti bərpa edir.
Nümunə:
Tutaq ki, obyektin bütün sahələrini yox, yalnız bəzi sahələrini saxlamaq istəyirik. Bunun üçün __getstate__()
metodunda bu addımları yerinə yetirmək lazımdır:
- Obyektin cari vəziyyətini (
__dict__
xidmət sahəsi ilə təyin olunmuş) ayrıca bir dəyişənə —state
lüğətinə kopyalamaq. - Serializasiya edilməməli olan sahələri oradan silmək.
__getstate__()
funksiyasının nəticəsi kimi yaranan obyekt qaytarılır.
import pickle
class CustomClass:
def __init__(self, value):
self.value = value
self.internal_state = "internal"
def __getstate__(self):
state = self.__dict__.copy()
del state['internal_state'] # Daxili vəziyyəti istisna edirik
return state
def __setstate__(self, state):
self.__dict__.update(state)
self.internal_state = "restored internal" # Daxili vəziyyəti bərpa edirik
def __repr__(self):
return f"CustomClass(value={self.value}, internal_state={self.internal_state})"
# Obyektin yaradılması
obj = CustomClass(42)
print("Orijinal obyekt:", obj)
# Obyektin serializasiyası
serialized_obj = pickle.dumps(obj)
print("Serializasiya olunan obyekt:", serialized_obj)
# Obyektin deserializasiyası
deserialized_obj = pickle.loads(serialized_obj)
print("Deserializasiya olunan obyekt:", deserialized_obj)
Deserializasiya zamanı, __setstate__()
funksiyasında iki şeyi edirik:
- Mövcud obyektin vəziyyətini
update()
metodu vasitəsilə yeniləyirik. -
internal_state
sahəsi (və digər serializə olunmayan sahələr) yeni dəyərlər alır.
GO TO FULL VERSION