سمات الصفات التحولات

ملاحظة قصيرة من مسلسل "لقد تم تحذيرك".

يجلب التحول من لغات البرمجة الكلاسيكية إلى Python الكثير من المفاجآت.
اقرأ الوثائق:
بشكل عام ، تكون متغيرات المثيل للبيانات الفريدة لكل مثيل ومتغيرات الصفات هي للسمات والطرق التي تشترك فيها جميع مثيلات الفصل
دعونا نحاول اللعب

class Vessel: #class attribute vtype = "boat" #instance attribute def __init__(self, name): self.name = name #    def __str__(self): res= '>>' for a in inspect.getmembers( self): if not a[0].startswith("__"): res += f"{a[0]}={a[1]:<14}" for a in inspect.getmembers( self.__class__): if not a[0].startswith("__"): res += f"__class__.{a[0]}={a[1]:<14}" return res 


أنشئ كائنين ، تحقق من قيم جميع السمات:

 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) 

Source: https://habr.com/ru/post/ar427065/


All Articles