تقنية

خاصية بايثون: لماذا يعطي hasattr نتيجة False؟

فحص عادي وفحص ثابت
النتيجة الثانية كائن property. [1] [2]

الفحص قد يشغل الجلب. [1] [2]

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

False من hasattr لا يثبت غياب تعريف property؛ قد ترفع دالة جلبها AttributeError. [1] [2]

  • hasattr(c,"score") يشغل الجلب؛ خطؤنا المعلن يعطي False. [1] [2]
  • getattr_static(c,"score") يعيد كائن property دون تشغيل الجلب. [1] [2]
  • فحص isinstance(p,property) يعطي True؛ ليس هذا قيمة score المحسوبة. [1] [2]
  • إذا رفع الجلب ValueError، ينتشر الخطأ عبر hasattr. [1] [2]
  • جربنا 3.12.14 وفئة عادية؛ البحث المخصص والسمات الديناميكية خارج المثال. [1] [2]

المثال

from inspect import getattr_static
class C:
    @property
    def score(self):
        raise AttributeError("pending")
c=C()
print(hasattr(c,"score"))
p=getattr_static(c,"score")
print(isinstance(p,property))

[1] [2]

الناتج: False ثم True. [1] [2]

التفسير

hasattr يحاول جلب السمة ويعالج AttributeError. تعريف الخاصية موجود؛ فشل الجلب لا ينفيه. [1] [2]

الفحص الثابت

p هو الواصف نفسه. استرجاعه لم يحسب score؛ العثور عليه لا يثبت نجاح دالة الجلب. [1] [2]

نوع الخطأ

إذا رفع الجلب ValueError بدل AttributeError، فلا نحصل على False؛ ينتشر الاستثناء. [1] [2]

نوع خطأ الجلب يغير النتيجة
أثر الجلب على hasattr. [1] [2]

النطاق

فئة عادية في 3.12.14؛ لا نجعل الفحص الثابت بديلًا مطابقًا لكل بحث ديناميكي. [1] [2]

المراجع

  1. Python: الفحص الثابت للسمات
  2. Python: hasattr وproperty
  3. موضوع تك: لغة بايثون — مفردات
  4. موضوع تك: تطبيقات بايثون — مفردات

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