في مثال 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]

الواصف والتحكم
عند قراءة الفئة، الواصف يرفع 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]
المراجع
للتوسع: لغات البرمجة.
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
