Pertanyaan Bagaimana mengetahui apakah suatu objek memiliki atribut dengan Python


Apakah ada cara di Python untuk menentukan apakah suatu objek memiliki beberapa atribut? Sebagai contoh:

>>> 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'

Bagaimana Anda bisa tahu jika a memiliki atribut property sebelum menggunakannya?


1137
2018-03-04 14:45


asal


Jawaban:


Mencoba hasattr():

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

EDIT: Lihat Jawaban zweiterlinde di bawah ini, yang menawarkan nasihat yang baik tentang meminta maaf! Pendekatan yang sangat pesimis!

Praktek umum dalam python adalah bahwa, jika properti itu mungkin ada di sana sebagian besar waktu, cukup sebut saja dan biarkan pengecualian menyebar, atau menjebaknya dengan blok try / except. Ini kemungkinan akan lebih cepat daripada hasattr. Jika properti kemungkinan tidak ada di sana sebagian besar waktu, atau Anda tidak yakin, gunakan hasattr mungkin akan lebih cepat daripada berulang kali jatuh ke blok pengecualian.


1589
2018-03-04 14:48



Sebagai Jarret Hardie dijawab, hasattr akan melakukan trik. Saya ingin menambahkan, meskipun, bahwa banyak di komunitas Python merekomendasikan strategi "lebih mudah untuk meminta maaf daripada izin" (EAFP) daripada "lihat sebelum Anda melompat" (LBYL). Lihat referensi ini:

EAFP vs LBYL (Re: Sedikit kecewa sejauh ini)
EAFP vs. LBYL @Code Seperti Pythonista: Python Idiomatic

yaitu:

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

... lebih disukai:

if hasattr(a, 'property'):
    doStuff(a.property)
else:
    otherStuff()

461
2018-03-04 14:56



Kamu dapat memakai hasattr() atau tangkap AttributeError, tetapi jika Anda benar-benar hanya menginginkan nilai atribut dengan default jika tidak ada, opsi terbaik hanya digunakan getattr():

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

370
2018-03-04 17:54



Saya pikir apa yang Anda cari adalah hasattr. Namun, saya merekomendasikan sesuatu seperti ini jika Anda ingin mendeteksi properti python-

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

Kerugiannya di sini adalah kesalahan atribut dalam properti __get__ kode juga tertangkap.

Kalau tidak, lakukan-

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

Documents:http://docs.python.org/library/functions.html
PERINGATAN:
Alasan rekomendasi saya adalah hasattr tidak mendeteksi properti.
Link:http://mail.python.org/pipermail/python-dev/2005-December/058498.html


33
2018-03-04 14:52



Menurut pydoc, hasattr (obj, prop) hanya memanggil getattr (obj, prop) dan menangkap pengecualian. Jadi, sama sahnya untuk membungkus akses atribut dengan pernyataan coba dan menangkap AttributeError seperti menggunakan hasattr () sebelumnya.

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

24
2018-03-04 14:56



Saya ingin menyarankan untuk menghindari ini:

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

Pengguna @jpalecek menyebutkannya: Jika sebuah AttributeError terjadi di dalam doStuff(), kau tersesat.

Mungkin pendekatan ini lebih baik:

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

13
2017-08-26 13:04



Bergantung pada situasi yang dapat Anda periksa isinstance apa jenis objek yang Anda miliki, dan kemudian gunakan atribut yang sesuai. Dengan diperkenalkannya kelas dasar abstrak dengan Python 2.6 / 3.0, pendekatan ini juga menjadi jauh lebih kuat (pada dasarnya ABC memungkinkan cara mengetik bebek yang lebih canggih).

Satu situasi adalah ini berguna jika dua objek yang berbeda memiliki atribut dengan nama yang sama, tetapi dengan arti yang berbeda. Hanya menggunakan hasattr mungkin kemudian menyebabkan kesalahan aneh.

Salah satu contoh bagus adalah perbedaan antara iterator dan iterables (lihat ini pertanyaan). Itu __iter__ metode dalam iterator dan iterable memiliki nama yang sama tetapi secara semantis cukup berbeda! Begitu hasattr tidak berguna, tapi isinstance bersama dengan ABC menyediakan solusi bersih.

Namun, saya setuju bahwa dalam kebanyakan situasi hasattr pendekatan (dijelaskan dalam jawaban lain) adalah solusi yang paling tepat.


11
2018-03-04 15:41



EDIT: Pendekatan ini memiliki batasan serius. Ini harus berfungsi jika objeknya adalah iterable satu. Silakan periksa komentar di bawah ini.

Jika Anda menggunakan Python 3.6 atau lebih tinggi seperti saya ada alternatif yang nyaman untuk memeriksa apakah suatu objek memiliki atribut tertentu:

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

Namun, saya tidak yakin pendekatan mana yang terbaik saat ini. menggunakan hasattr(), menggunakan getattr() atau menggunakan in. Komentar dipersilahkan.


9
2018-06-22 06:32



Harap Anda mengharapkan hasattr (), tetapi cobalah untuk menghindari hasattr () dan silakan pilih getattr (). getattr () lebih cepat dari hasattr ()

menggunakan hasattr ():

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

sama di sini saya menggunakan getattr untuk mendapatkan properti jika tidak ada properti itu tidak kembali

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

7
2017-12-30 07:49