شروحات الكمبيوتر والإنترنت والموبايل

تخليل كائن في بايثون مع طرق مستدامة

تعد عملية تسلسل الكائنات في بايثون من المهام الشائعة التي تنطوي على حفظ الحالة الأنية للكائنات، وبالتالي يمكن استرجاعها لاحقًا. لكن ما يحدث عندما نرغب في الحفاظ على الأساليب المرتبطة بتلك الكائنات بعد إعادة تحميلها؟ في هذا المقال، سنتناول كيفية تسلسل مثيل كائن في بايثون مع الحفاظ على الأساليب الثابتة.

ما هو مفهوم المخلل (Pickling) في بايثون؟

عندما نتحدث عن "المخلل" في بايثون، فإننا نشير إلى طريقة تحويل كائنات البرمجة إلى سلسلة من البيانات القابلة للحفظ. هذه العملية تمكننا من استعادة الكائنات المستخدمة في البرنامج لاحقًا. يُعد كل من الموديلين pickle و dill من الأدوات الشائعة المستخدمة لهذا الغرض. بينما يوفر pickle القدرة على تسلسل الكائنات البسيطة، يوفر dill دعمًا أكبر لعناصر بايثون الأكثر تعقيدًا مثل الدروس والطرق.

كيفية تسلسل مثيل كائن مع الأساليب الثابتة

لحفظ مثيل كائن مع الحفاظ على الأساليب ذات الصلة، يمكن استخدام مكتبة dill. سنقوم بتعريف فئة بسيطة تتضمن مُنشئ وطريقة، ثم نستخدم dill لتسلسل مثيل لتلك الفئة.

import dill
class Test():
    def __init__(self, value=10):
        self.value = value
    def foo(self):
        print(f"Bar! القيمة هي: {self.value}")
# إنشاء مثيل للكائن
t = Test(value=20)
# تسلسل المثيل وحفظه في ملف
with open('Test.pkl', 'wb+') as fp:
    dill.dump(t, fp)
# اختبار الكائن الأصلي
print('Original: ')
t.foo()  # يطبع "Bar! القيمة هي: 20"

هذه الشيفرة السابقة تمكننا من حفظ الحالة الحالية لمثيل الكائن. بعد ذلك، يمكننا إعادة تحميل هذا الكائن في وقت لاحق باستخدام dill، ولكننا قد نواجه مشكلة إذا قمنا بتعديل تعريف الفئة.

مشاكل إعادة التحميل

عندما نحاول إعادة تحميل الكائن، قد نلاحظ أن الطريقة التي قمنا بتعريفها قد تغيرت. لنلق نظرة على ما يحدث إذا قمنا بتغيير تعريف الفئة:

class Test():
    def __init__(self, value=10):
        self.value = value
    def foo(self):
        print("...not bar؟")
# إعادة تحميل الكائن المخلل
with open('Test.pkl', 'rb') as fp:
    t2 = dill.load(fp)
# اختبار الكائن المعاد تحميله
print('إعادة تحميل: ')
t2.foo()  # يطبع "...ليس شريطًا؟"

كما يمكن أن نرى، الأمر يؤدي إلى فقدان الوظيفة الأصلية لـ foo وظهور طريقة جديدة بدلاً منها. ولكن تظل قيمة السمة كما كانت، مما يعطينا قيمة مثيل محفوطة ولكن مع تغير الأساليب.

الحفاظ على الطرق القديمة

واحدة من الطرق للحفاظ على الطرق القديمة إلى جانب سمات الكائن هي القيام بتسلسل تعريف الفئة نفسها بدلاً من المثيل. على الرغم من ذلك، فإن ذلك قد يعني فقدان السمات الخاصة بالمثيل، مما يجعل العملية معقدة. إليك كيفية القيام بذلك:

with open('Test.pkl', 'wb+') as fp:
    dill.dump(Test, fp)
# إعادة بناء الكائن باستخدام الفئة المعاد تحميلها
with open('Test.pkl', 'rb') as fp:
    test_class = dill.load(fp)
    t2 = test_class(value=20)
# اختبار الكائن المعاد بناؤه
print('Reloaded: ')
t2.foo()  # يطبع "Bar! القيمة هي: 20"

الحلول الممكنة

بدلاً من استخدام أساليب التسلسل المباشرة فقط، يمكن للمطورين استخدام تنسيقات بيانات أخرى مثل JSON لتخزين السمات بشكل منفصل، مما يسهل استرداد القيم بعد التعديلات. أيضًا، تعتبر الإدارة الجيدة للإصدارات أمرًا محوريًا، بحيث يمكن استخدام التعريفات القديمة عند الحاجة، دون تكرار كتابة الشيفرة.

الخاتمة

في الختام، يعتبر تسلسل مثيل كائن مع الحفاظ على الأساليب الثابتة عملية تحتاج إلى تخطيط جيد واستراتيجيات مناسبة. باستخدام dill، يمكن للمطورين معالجة العديد من التعقيدات المرتبطة بالأساليب المحدثة. يمكن استخدام تقنيات مثل تخزين السمات خارج الكائن إلى جانب التسليم الفعال لتعريفات الفئات لضمان سهولة إعادة استخدام الكائنات. إن فهم كيفية تسلسل كائن الفئة في بايثون مع أساليب دائمة هو أمر مهم جداً للمبرمجين لضمان بقاء التطبيق مرنًا وقابلًا للصيانة.

فهد السلال

خبير تقني متخصص في شروحات الكمبيوتر والإنترنت والموبايل، يتمتع بخبرة واسعة في تقديم حلول تقنية مبتكرة ومبسطة. يهدف فهد إلى مساعدة المستخدمين على تحسين تجربتهم التقنية من خلال مقالات وأدلة عملية واضحة وسهلة الفهم.
زر الذهاب إلى الأعلى
Don`t copy text!