Diberikan objek Python dalam bentuk apa pun, adakah cara mudah untuk mendapatkan daftar semua metode yang dimiliki objek ini?
Atau,
jika ini tidak memungkinkan, adakah setidaknya cara mudah untuk memeriksa apakah ia memiliki metode tertentu selain hanya memeriksa jika kesalahan terjadi ketika metode dipanggil?
python
introspection
Thomas Lötzer
sumber
sumber
Jawaban:
Untuk banyak objek , Anda dapat menggunakan kode ini, menggantikan 'objek' dengan objek yang Anda minati:
Saya menemukannya di diveintopython.net (Sekarang diarsipkan). Semoga itu memberikan detail lebih lanjut!
Jika Anda mendapatkan
AttributeError
, Anda dapat menggunakan ini sebagai gantinya :getattr(
tidak toleran dengan gaya panda python3.6 abstrak virtual sub-kelas. Kode ini melakukan hal yang sama seperti di atas dan mengabaikan pengecualian.sumber
print [method for method in dir(object) if callable(getattr(object, method))]
.AttributeError: module 'pandas.core.common' has no attribute 'AbstractMethodError'
ketika saya mencoba menjalankan ini. Lihat detail di stackoverflow.com/q/54713287/9677043 .Anda dapat menggunakan
dir()
fungsi bawaan untuk mendapatkan daftar semua atribut yang dimiliki modul. Coba ini di baris perintah untuk melihat cara kerjanya.Anda juga dapat menggunakan
hasattr(module_name, "attr_name")
fungsi ini untuk mengetahui apakah suatu modul memiliki atribut tertentu.Lihat panduan introspeksi Python untuk informasi lebih lanjut.
sumber
hasattr
membantu kasus penggunaan saya untuk menemukan apakah objek python memiliki variabel anggota tertentu atau metode.Metode paling sederhana adalah menggunakan
dir(objectname)
. Ini akan menampilkan semua metode yang tersedia untuk objek itu. Trik keren.sumber
AttributeError: module 'pandas.core.common' has no attribute 'AbstractMethodError'
. Ada ide? Lihat deet di stackoverflow.com/q/54713287/9677043 . +1 ke @Pawan Kumar b / c jawabannya berfungsi, dan ke @ ljs untuk janji daftar yang disaring dari hanya metode.Untuk memeriksa apakah ia memiliki metode tertentu:
sumber
if hasattr(obj,method) and callable(getattr(obj,method)):
Saya percaya bahwa yang Anda inginkan adalah sesuatu seperti ini:
Menurut pendapat saya yang sederhana, fungsi bawaan
dir()
dapat melakukan pekerjaan ini untuk Anda. Diambil darihelp(dir)
output di Shell Python Anda:Sebagai contoh:
Ketika saya sedang memeriksa masalah Anda, saya memutuskan untuk menunjukkan pemikiran saya, dengan format yang lebih baik dari hasil
dir()
.dir_attributes.py (Python 2.7.6)
dir_attributes.py (Python 3.4.3)
Semoga saya berkontribusi :).
sumber
Di atas jawaban yang lebih langsung, saya akan lalai jika saya tidak menyebutkan iPython . Tekan 'tab' untuk melihat metode yang tersedia, dengan pelengkapan otomatis.
Dan setelah Anda menemukan metode, coba:
untuk melihat pydocs, tanda tangan metode, dll.
Ahh ... REPL .
sumber
Jika Anda secara khusus menginginkan metode , Anda harus menggunakan metode inspect.ismet .
Untuk nama metode:
Untuk metode itu sendiri:
Terkadang
inspect.isroutine
dapat berguna juga (untuk built-in, ekstensi C, Cython tanpa direktif kompilasi "mengikat").sumber
inspect.getmembers
alih-alih menggunakandir
dalam pemahaman daftar?Buka bash shell (ctrl + alt + T di Ubuntu). Mulai shell python3 di dalamnya. Buat objek untuk mengamati metode. Tambahkan saja titik setelahnya dan tekan dua kali "tab" dan Anda akan melihat sesuatu seperti itu:
sumber
ipython
, mulai mengetik objek dan tekantab
dan itu akan berhasil juga. Tidak diperlukan pengaturan readlineMasalah dengan semua metode yang ditunjukkan di sini adalah bahwa Anda TIDAK BISA yakin bahwa metode tidak ada.
Dengan Python Anda dapat memotong titik yang memanggil melalui
__getattr__
dan__getattribute__
, memungkinkan untuk membuat metode "saat runtime"Contoh:
Jika Anda menjalankannya, Anda dapat memanggil metode yang tidak ada di kamus objek ...
Dan itu sebabnya Anda menggunakan Lebih Mudah untuk meminta pengampunan daripada paradigma izin di Python.
sumber
Cara paling sederhana untuk mendapatkan daftar metode dari objek apa pun adalah dengan menggunakan
help()
perintah.Ini akan mencantumkan semua metode yang tersedia / penting yang terkait dengan objek itu.
Sebagai contoh:
sumber
%
dilakukan pada contoh pertama? Itu tidak berfungsi di Python 2.7 saya.Ini seharusnya bekerja :)
sumber
Seseorang dapat membuat
getAttrs
fungsi yang akan mengembalikan nama properti yang bisa dipanggil objekItu akan kembali
sumber
Tidak ada cara yang dapat diandalkan untuk mendaftar semua metode objek.
dir(object)
biasanya bermanfaat, tetapi dalam beberapa kasus mungkin tidak mencantumkan semua metode. Menurutdir()
dokumentasi : "Dengan argumen, cobalah untuk mengembalikan daftar atribut yang valid untuk objek itu."Memeriksa metode yang ada dapat dilakukan
callable(getattr(object, method))
seperti yang telah disebutkan di sana.sumber
Ambil daftar sebagai objek
list(filter(lambda x:callable(getattr(obj,x)),obj.__dir__()))
Anda mendapatkan:
sumber
Meskipun " Lebih mudah meminta pengampunan daripada izin " tentu saja merupakan cara Pythonic, apa yang Anda cari mungkin:
sumber
Untuk mencari metode tertentu di seluruh modul
sumber
Jika Anda, misalnya, menggunakan shell plus Anda dapat menggunakan ini sebagai gantinya:
seperti itu, dengan '??' tepat setelah objek Anda, itu akan menunjukkan semua atribut / metode yang dimiliki kelas.
sumber