توسيع أنواع Python المضمنة باستخدام السمات والأساليب المخصصة
في Python، توسيع الأنواع المضمنة مثل القواميس بطرق أو سمات مخصصة قد يبدو وكأنه طلب مباشر. ومع ذلك، فإن تصميم بايثون لا يدعم مثل هذه التعديلات أصلاً. على عكس آلية وراثة النموذج الأولي لجافا سكريبت، فإن الأنواع المضمنة في بايثون ثابتة وغير قابلة للتغيير.
النهج البديل: تصنيف فرعي للفئة
في حين أن إضافة الأساليب مباشرة إلى الأنواع المضمنة ليس كذلك ممكن، يمكنك تحقيق تأثير مماثل عن طريق تصنيف النوع فرعيًا واستبداله في مساحة الاسم العامة. يتيح لك هذا إضافة سمات وطرق مخصصة لمثيلات الفئة الفرعية الجديدة.على سبيل المثال، لنفترض أننا نريد إضافة طريقة helloWorld() إلى نوع الإملاء. يمكننا إنشاء الفئة الفرعية التالية:
class mydict(dict):
def helloWorld(self):
# Custom method implementation
print("Hello world from mydict!")
لاستبدال الإملاء المدمج بفئتنا الفرعية، يمكننا استخدام الوحدة __builtin__:import __builtin__
__builtin__.dict = mydict
الاستخدام والقيود
الآن، أي قواميس مستقبلية يتم إنشاؤها باستخدام مُنشئ الإملاء ستكون مثيلات لـ mydict وستحتوي على الأسلوب helloWorld():d = dict()
d.helloWorld() # Outputs "Hello world from mydict!"
ومع ذلك، من المهم ملاحظة أن الكائنات التي تم إنشاؤها باستخدام بناء الجملة الحرفي ستظل مثيلات لنوع الإملاء الأصلي ولن تحتوي على أساليب أو سمات مخصصة :d = {}
d.helloWorld() # Raises AttributeError
وذلك لأن البناء الحرفي يتجاوز عملية بناء الكائن وينشئ مباشرة مثيلات للأنواع المضمنة. للتغلب على هذا القيد، يمكنك تحديد وظيفة تقوم بتحويل الكائنات المضمنة إلى مثيلات الفئة الفرعية الخاصة بك:def my_dict(d):
return mydict(d)
ثم استخدم الوظيفة بدلاً من بناء الجملة الحرفي لإنشاء القواميس:d = my_dict({})
d.helloWorld() # المخرجات "مرحبًا بالعالم من mydict!"
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3