اذهب إلى المحتوى

السؤال

نشر

وجدت كود يحتوي على بعض الأصناف classes ومن ضمن هذه الخصائص وجدت أنها تسمى بهذه الطريقة

__var = value

شرطتين سفليتين ( _ _ )المشكلة أن هذه الخصائص لا يتم طباعتها عندما أحاول ذلك وأحصل على الخطأ التالي:

AttributeError: 'X' object has no attribute '__var'

ما هي هذه المتغيرات وهل توجد طريقة لطباعتها أو الحصول على قيمتها؟

Recommended Posts

  • 0
نشر

استخدام بادئة الشرطة السفلية المزدوجة تؤدي إلى قيام مترجم 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
نشر

يقوم 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

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...