ملاحظة قصيرة من مسلسل "لقد تم تحذيرك".
يجلب التحول من لغات البرمجة الكلاسيكية إلى Python الكثير من المفاجآت.
اقرأ الوثائق:
بشكل عام ، تكون متغيرات المثيل للبيانات الفريدة لكل مثيل ومتغيرات الصفات هي للسمات والطرق التي تشترك فيها جميع مثيلات الفصل
دعونا نحاول اللعب
class Vessel:
أنشئ كائنين ، تحقق من قيم
جميع السمات:
Iowa = Vessel("Iowa") Drum=Vessel("Drum") printAttr(Iowa, Drum) >>name=Iowa vtype=boat __class__.vtype=boat >>name=Drum vtype=boat __class__.vtype=boat
حتى الآن ، كما هو متوقع.
دعونا نحاول تغيير vtype: يمكن القيام بذلك بطريقتين ، وهما في الأساس عبارة عن بنية مختلفة من نفس الشيء
Vessel.vtype = "USS boat" printAttr(Iowa, Drum) >>name=Iowa vtype=USS boat __class__.vtype=USS boat >>name=Drum vtype=USS boat __class__.vtype=USS boat Iowa.__class__.vtype = 'USS WW2 Boat' printAttr(Iowa, Drum) >>name=Iowa vtype=USS WW2 Boat __class__.vtype=USS WW2 Boat >>name=Drum vtype=USS WW2 Boat __class__.vtype=USS WW2 Boat
ومرة أخرى ، كل شيء على ما يرام.
الآن دعنا نحاول أن نفعل نفس الشيء من خلال سمة الكائن.
Drum.vtype = 'submarine' printAttr(Iowa, Drum) >>name=Iowa vtype=USS WW2 Boat __class__.vtype=USS WW2 Boat >>name=Drum vtype=submarine __class__.vtype=USS WW2 Boat
وهنا المفاجأة الأولى: على الرغم من حقيقة أن vtype هو صفة فئة ، فجأة يصبح صفة كائن.
تحقق:
Vessel.vtype = "NAVY Museum" >>name=Iowa vtype=NAVY Museum __class__.vtype=NAVY Museum >>name=Drum vtype=submarine __class__.vtype=NAVY Museum
ماذا لو ...
del Drum.vtype >>name=Iowa vtype=NAVY Museum __class__.vtype=NAVY Museum >>name=Drum vtype=NAVY Museum __class__.vtype=NAVY Museum
ومرة أخرى سمة فئة.
لم يعد التعبير التالي يمر
del Drum.vtype printAttr(Iowa, Drum) del Drum.vtype AttributeError: vtype
ويحل المثال الأخير الذي يحاكي الفئة ويزيل سمة vtype.
Drum.vtype = 'submarine' del Vessel.vtype printAttr(Iowa, Drum) >>name=Iowa >>name=Drum vtype=submarine
إذا بدأت في التعامل مع مساحة الاسم ، يصبح هذا السلوك مفهومًا.
ومع ذلك ، بالنسبة للمبرمجين الذين عملوا سابقًا بلغات عادية ، يبدو هذا غريبًا على الأقل. وإذا تحدثنا عن المشاريع الكبيرة التي تدعمها عدة أجيال من المطورين ، فقد يتحول ذلك إلى فشل المواعيد النهائية ، وما إلى ذلك.
مع الأخذ في الاعتبار مفهوم Python أن كل شيء مفتوح للجميع ، فلماذا لا تجعل الوصول إلى السمات "الرائعة" فقط من خلال __class__ أو نظيرتها. في رأيي ، هذا سيحمي على الأقل بطريقة أو بأخرى من المفاجآت ويجعلني أفكر 10 مرات قبل تعيين شيء لسمات الصف على مستوى الكائن.
تحديث: Text PrintAttr
def printAttr(*o): for a in o: print(a)