Adam Ebrahim نشر 3 يونيو 2021 أرسل تقرير نشر 3 يونيو 2021 وجدت كود يحتوي على بعض الأصناف classes ومن ضمن هذه الخصائص وجدت أنها تسمى بهذه الطريقة __var = “value” شرطتين سفليتين ( _ _ )المشكلة أن هذه الخصائص لا يتم طباعتها عندما أحاول ذلك وأحصل على الخطأ التالي: AttributeError: 'X' object has no attribute '__var' ما هي هذه المتغيرات وهل توجد طريقة لطباعتها أو الحصول على قيمتها؟ 1 اقتباس
0 محمد أبو عواد نشر 3 يونيو 2021 أرسل تقرير نشر 3 يونيو 2021 استخدام بادئة الشرطة السفلية المزدوجة تؤدي إلى قيام مترجم Python بإعادة كتابة اسم المتغير لتجنب تعارض التسمية في الأصناف الابناء أو الأصناف الموروثة للصنف الأب, حيث يغير المترجم اسم المتغير بطريقة تجعل من الصعب إنشاء تصادمات عند وراثة الصنف لاحقا, لنحاول شرح بمثال سريع class Test: def __init__(self): self.x = 1 self.__y = 2 قمت بانشاء صنف Test, وهناك خاصية اسمها x وخاصية __y, سوف نحاول طباعة الخاصيتين بشكل طبيعي t1 = Test() print(t1.x) print(t1.__y) لن يتم طباعة شيء وسوف نواجه الخطأ التالي , وهذا يحدث بسبب تجنب تعارض الأسماء في الأصناف الأبناء والصنف الأب AttributeError: 'X' object has no attribute '__var' ما الحل اذا؟ الحل أن نقوم بكتباة اسم الصنف مسبوقا باشارة شرطو سفلية قبل اسم الخاصية t1 = Test() print(t1.x) print(t1.__y) الآن سوف تكون النتيجة كالتالي 1 2 1 اقتباس
1 Nuhla Almasri نشر 3 يونيو 2021 أرسل تقرير نشر 3 يونيو 2021 يقوم Double Pre Underscores بإخبار مترجم Python بإعادة كتابة اسم السمة للفئات الفرعية لتجنب تعارض التسمية. Name Mangling: - يقوم مترجم Python بتغيير اسم المتغير بطريقة تجعل من الصعب الصدام عندما يتم توريث الفئة. بما معناه أن البايثون يقوم بتغيير الأسم حتى لا يكون هناك اي تصادمات بين اسماء المتغيرات الموجود فحتى لو حاولت أستخدام اوبجت من الصنف ثم قمت بإستخدام أسم هذا المتغير حتى تقوم بتغييره أو طباعته فلن يكون موجود على الإطلاق لانه تم تغيير أسم المتغير بهذه الطريقة class Sample(): def __init__(self): self.a = 1 self._b = 2 self.__c = 3 obj1 = Sample() dir(obj1) فلن يقوم بطباعة الخاصية __c أما أن أردت طباعتها قستقوم بالتتالي print(obj1._Sample__c) تعمل هذه الحاصية حتى يتم التفريق بين المتغيرات و خصوصا بالتوريت فأذا اردت أستخدام نفس أسم المتغير في الأصناف التي يتم توريثها من صنف آخر فما عليك سوي وضع هاتين الشرطتين و هنا سأقوم بوضع مثال على التوريث كالتالي class Sample(): def __init__(self): self.a = 1 self._b = 2 self.__c = 3 #هنا صنف ثاني يرث من الصنف الأول class SecondClass(Sample): def __init__(self): super().__init__() self.a = "overridden" self._b = "overridden" self.__c = "overridden" obj2 = SecondClass() print(obj2.a) #سيقوم بطباعة override print(obj2._b) #سيقوم بطباعة override print(obj2.__c)# سيقوم بإعطاء أنه لا يوجد متغير بهذا الأسم # لكن هنا يمكنك أن تستخدم المنغير للصنف الأول و الثاني أيضا بهذا الطريقة print(obj2._SecondClass__c) #سيطبع overridden print(obj2._Sample__c) # سيطبع 3 2 اقتباس
السؤال
Adam Ebrahim
وجدت كود يحتوي على بعض الأصناف classes ومن ضمن هذه الخصائص وجدت أنها تسمى بهذه الطريقة
شرطتين سفليتين ( _ _ )المشكلة أن هذه الخصائص لا يتم طباعتها عندما أحاول ذلك وأحصل على الخطأ التالي:
AttributeError: 'X' object has no attribute '__var'
ما هي هذه المتغيرات وهل توجد طريقة لطباعتها أو الحصول على قيمتها؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.