تقنية

DynamicClassAttribute في بايثون: من أين تأتي قيمة سمة الفئة؟

DynamicClassAttribute; Own: Meta; Own().value: bud; Own.value: leaf
كائن وفئة.

في مثال DynamicClassAttribute، قراءة الكائن تستدعي getter؛ قراءة الفئة تصل إلى __getattr__ في metaclass. [1] [2]

الخلاصة السريعة

من Meta في مثال الفئة. [1] [2]

  • في مثال DynamicClassAttribute، قراءة الكائن تستدعي getter؛ قراءة الفئة تصل إلى __getattr__ في metaclass. [1] [2]
  • في CPython 3.12.14، نزين getter عادية تعيد bud، ونعرّف Meta لتعطي leaf للسمة value. [1] [2]
  • Own().value تعطي bud وOwn.value تعطي leaf؛ ترتيب الأحداث getter ثم meta:value. [1] [2]
  • عند قراءة الفئة، الواصف يرفع AttributeError في هذا المسار؛ لا يستدعي getter، ويتاح مسار __getattr__ المخصص. [1] [2]
  • تحكم: Plain بلا metaclass مخصصة؛ كائنها يعطي bud، لكن Plain.value ترفع AttributeError. لا نختبر getter مجردة أو التعيين والحذف. [1] [2]

مصدر القيمة

في مثال DynamicClassAttribute، قراءة الكائن تستدعي getter؛ قراءة الفئة تصل إلى __getattr__ في metaclass. [1] [2]

الفئة والكائن

في CPython 3.12.14، نزين getter عادية تعيد bud، ونعرّف Meta لتعطي leaf للسمة value. [1] [2]

قراءتان مختلفتان

Own().value تعطي bud وOwn.value تعطي leaf؛ ترتيب الأحداث getter ثم meta:value. [1] [2]

from types import DynamicClassAttribute events=[] class Meta(type): def __getattr__(cls,name): events.append("meta:"+name) if name=="value":return "leaf" raise AttributeError(name) class Own(metaclass=Meta): @DynamicClassAttribute def value(self): events.append("getter");return "bud" print(Own().value,Own.value) print(events) [1] [2]

DynamicClassAttribute; Plain: no custom metaclass; Plain().value: bud; Plain.value: AttributeError
تحكم بلا Meta.

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

عند قراءة الفئة، الواصف يرفع AttributeError في هذا المسار؛ لا يستدعي getter، ويتاح مسار __getattr__ المخصص. [1] [2]

class Plain: @DynamicClassAttribute def value(self):return "bud" print(Plain().value) try:print(Plain.value) except AttributeError:print("AttributeError") [1] [2]

تحكم: Plain بلا metaclass مخصصة؛ كائنها يعطي bud، لكن Plain.value ترفع AttributeError. لا نختبر getter مجردة أو التعيين والحذف. [1] [2]

المراجع

  1. Python types
  2. CPython types

للتوسع: لغات البرمجة.

أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.