python مكتبة كيفية معرفة ما إذا كان الكائن له سمة في بايثون




مكتبة اكواد بايثون (8)

وفقا ل pydoc ، hasattr (obj، prop) ببساطة يستدعي getattr (obj، prop) ويكتفي بالاستثناءات. لذلك ، يكون صالحًا تمامًا لفرض الوصول إلى السمة باستخدام عبارة المحاولة وصيد AttributeError كما هو لاستخدام hasattr () مسبقًا.

a = SomeClass()
try:
    return a.fake_prop
except AttributeError:
    return default_value

هل هناك طريقة في بايثون لتحديد ما إذا كان كائن لديه بعض السمة؟ فمثلا:

>>> a = SomeClass()
>>> a.someProperty = value
>>> a.property
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: SomeClass instance has no attribute 'property'

كيف يمكنك معرفة ما إذا كان يحتوي property المميزة قبل استخدامها؟


أود أن أقترح تجنب هذا:

try:
    doStuff(a.property)
except AttributeError:
    otherStuff()

ذكر المستخدمjpalecek ذلك: إذا حدث AttributeError داخل doStuff() ، doStuff() .

ربما هذا النهج هو أفضل:

try:
    val = a.property
except AttributeError:
    otherStuff()
else:
    doStuff(val)

يمكنك استخدام hasattr() أو التقاط AttributeError ، ولكن إذا كنت تريد بالفعل قيمة السمة الافتراضية إذا لم تكن موجودة ، فإن أفضل خيار هو استخدام getattr() :

getattr(a, 'property', 'default value')

جرب hasattr() :

if hasattr(a, 'property'):
    a.property

تحرير: انظر الإجابة zweiterlinde أدناه ، الذي يقدم نصيحة جيدة حول الاستغفار! نهج pythonic جدا!

الممارسة العامة في python هي أنه إذا كان من المحتمل أن يكون هناك خاصية في معظم الوقت ، ببساطة قم باستدعاءها وإما السماح بالاستثناء بنشرها ، أو اعتراضها بمحاولة / عدا الحظر. هذا من المرجح أن يكون أسرع من hasattr . إذا كان من المحتمل ألا يكون العقار موجودًا في معظم الأوقات ، أو إذا لم تكن متأكدًا ، hasattr استخدام hasattr أسرع من الوقوع مرارًا في كتلة استثناء.


اعتمادا على الحالة يمكنك التحقق من isinstance أي نوع من الكائنات لديك ، ثم استخدم السمات المقابلة. مع تقديم فئات أساسية مجردة في Python 2.6 / 3.0 أصبح هذا النهج أكثر قوة (أساسا تسمح ABCs لطريقة أكثر تطورا من كتابة البط).

موقف واحد كان هذا مفيدًا إذا كان لكائنين مختلفين سمة لها نفس الاسم ، لكن بمعنى مختلف. باستخدام hasattr فقط قد يؤدي إلى أخطاء غريبة.

مثال جيد واحد هو التمييز بين التكرارات و iterables (انظر this السؤال). تكون الطرق __iter__ في __iter__ و iterable لها نفس الاسم ولكنها مختلفة تمامًا دلاليًا! لذا فإن hasattr عديم الفائدة ، ولكن isinstance مع ABC يوفر حلًا نظيفًا.

ومع ذلك ، أوافق على أن منهج hasattr في معظم الحالات (الموصوف في إجابات أخرى) هو الحل الأنسب.


تحرير : هذا النهج له قيود خطيرة. يجب أن يعمل إذا كان الكائن قابل للتكرار . يرجى التحقق من التعليقات أدناه.

إذا كنت تستخدم Python 3.6 أو أعلى مثلي ، فهناك بديل مناسب للتحقق مما إذا كان الكائن له سمة معينة:

if 'attr1' in obj1:
    print("attr1 = {}".format(obj1["attr1"]))

ومع ذلك ، لست متأكدًا من أفضل الطرق في الوقت الحالي. باستخدام hasattr() ، باستخدام getattr() أو باستخدام in . التعليقات هي موضع ترحيب.


أعتقد أن ما تبحث عنه هو hasattr . ومع ذلك ، أود أن أوصي بشيء من هذا القبيل إذا كنت ترغب في الكشف عن خصائص بيثون -

try:
    getattr(someObject, 'someProperty')         
except AttributeError:
    print "Doesn't exist"
else
    print "Exists"

العيب هنا هو أن أخطاء الخصائص في الخصائص __get__ code يتم الإمساك بها أيضًا.

خلاف ذلك ، افعل

if hasattr(someObject, 'someProp'):
    #Access someProp/ set someProp
    pass

المستندات: http://docs.python.org/library/functions.html
تحذير:
السبب في توصيتي هو أن hasattr لا يكشف عن الخصائص.
الرابط: http://mail.python.org/pipermail/python-dev/2005-December/058498.html


آمل أن تتوقع hasattr () ، ولكن في محاولة لتجنب hasattr () ويرجى تفضل getattr (). getattr () أسرع من hasattr ()

باستخدام hasattr ():

 if hasattr(a, 'property'):
     print a.property

نفس هنا أنا أستخدم getattr للحصول على الممتلكات إذا لم يكن هناك خاصية إرجاع أي

   property = getattr(a,"property",None)
    if property:
        print property






attributes