IC # kita melakukannya melalui refleksi. Dalam Javascript itu sederhana seperti:
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
Bagaimana cara melakukannya dengan Python?
python
reflection
properties
Jader Dias
sumber
sumber
@property
.Jawaban:
Ketahuilah bahwa dalam beberapa kasus yang jarang ada
__slots__
properti, kelas seperti itu seringkali tidak memiliki__dict__
.sumber
__setattr__()
. Menetapkan nilai secara langsung pada kamus melewati penyetel objek (dan / atau orang tuanya). Ini cukup umum dalam python bahwa lebih banyak hal daripada bertemu mata terjadi di latar belakang selama pengaturan atribut (misalnya sanitasi), menggunakansetattr()
memastikan bahwa Anda tidak ketinggalan, atau dipaksa untuk menanganinya secara eksplisit sendiri.vars()
hanya mengembalikan anggota statis (yaitu, atribut objek dan metode yang terdaftar dengan objek itu__dict__
). Itu tidak mengembalikan anggota dinamis (yaitu, atribut dan metode objek didefinisikan secara dinamis oleh__getattr__()
metode objek itu atau sihir yang serupa). Kemungkinan besar,file.ImplementationName
properti yang Anda inginkan didefinisikan secara dinamis dan karenanya tidak tersedia untukvars()
ataudir()
.Lihat
inspect.getmembers(object[, predicate])
.sumber
attributes
alih-alihmembers
(apakah ada perbedaan di antara keduanya?). Mereka bisa memperbaiki nama dengan Python 3.0 agar konsisten.__dict__
, maaf.inspect.getmembers()
membungkusdir()
dengan manfaat samping (sebagian besar diabaikan) (A) termasuk atribut kelas dinamis dan atribut metaclass dan (B) tidak termasuk anggota yang tidak cocok dengan predikat yang lulus. Menguap, kan?inspect.getmembers()
sesuai untuk pustaka pihak ketiga yang secara umum mendukung semua jenis objek yang mungkin. Namun, untuk kasus penggunaan standar,dir()
cukup memadai.dir()
adalah cara sederhana. Lihat disini:Panduan Untuk Introspeksi Python
sumber
dir()
terima kasih.The
__dict__
properti dari objek adalah kamus semua properti lainnya yang ditetapkan. Perhatikan bahwa kelas Python dapat mengesampingkan getattr dan membuat hal-hal yang terlihat seperti properti tetapi tidak ada di dalamnya__dict__
. Ada juga fungsi builtinvars()
dandir()
yang berbeda dalam cara yang halus. Dan__slots__
dapat menggantikan__dict__
di beberapa kelas yang tidak biasa.Objek rumit dengan Python.
__dict__
adalah tempat yang tepat untuk memulai pemrograman gaya refleksi.dir()
adalah tempat untuk memulai jika Anda mencari-cari di shell interaktif.sumber
print vars.__doc__
menunjukkan bahwaWith an argument, equivalent to object.__dict__
Jadi apa perbedaan yang halus itu?georg versi yang lebih pendek
sumber
Jika Anda mencari refleksi dari semua properti, jawaban di atas sangat bagus.
Jika Anda hanya mencari untuk mendapatkan kunci kamus (yang berbeda dari 'objek' dengan Python), gunakan
my_dict.keys()
sumber
obj['key']
vs.obj.property
) dan pertanyaannya adalah tentang properti objek. Saya meletakkan jawaban saya di sini karena ada kebingungan yang mudah antara keduanya.Ini sepenuhnya tercakup oleh jawaban lain, tetapi saya akan membuatnya eksplisit. Objek mungkin memiliki atribut kelas dan atribut instance statis dan dinamis.
stasis
bersifat statis,dyno
dinamis (lih. dekorator properti) danclassy
merupakan atribut kelas. Jika kita hanya melakukan__dict__
atauvars
kita hanya akan mendapatkan yang statis.Jadi jika kita mau yang lain
__dict__
akan mendapatkan segalanya (dan banyak lagi). Ini termasuk metode dan atribut sihir dan metode terikat normal. Jadi mari kita hindari itu:Yang
type
dipanggil dengan metode yang didekorasi dengan properti (atribut dinamis) akan memberi Anda jenis nilai yang dikembalikan, bukanmethod
. Untuk membuktikan ini, mari kita rekatkan:Seandainya itu metode yang pasti akan crash.
TL; DR. coba panggil
extravar = lambda o: {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}
ketiganya, tetapi jangan metode atau sihir.sumber