CodeGym /Kurslar /Python SELF AZ /Serialization idarəetməsi

Serialization idarəetməsi

Python SELF AZ
Səviyyə , Dərs
Mövcuddur

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__()__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:

  1. Obyektin cari vəziyyətini (__dict__ xidmət sahəsi ilə təyin olunmuş) ayrıca bir dəyişənə — state lüğətinə kopyalamaq.
  2. Serializasiya edilməməli olan sahələri oradan silmək.
  3. __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:

  1. Mövcud obyektin vəziyyətini update() metodu vasitəsilə yeniləyirik.
  2. internal_state sahəsi (və digər serializə olunmayan sahələr) yeni dəyərlər alır.
1
Опрос
Direktoriyalarla iş,  22 уровень,  2 лекция
недоступен
Direktoriyalarla iş
Direktoriyalarla iş
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION