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ə istinadKonstruktorun 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ə —statelüğə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_statesahəsi (və digər serializə olunmayan sahələr) yeni dəyərlər alır.
GO TO FULL VERSION