Saya ingin mengulangi melalui metode di kelas, atau menangani objek kelas atau contoh berbeda berdasarkan metode yang ada. Bagaimana cara saya mendapatkan daftar metode kelas?
Lihat juga:
- Bagaimana saya bisa mendaftar metode dalam modul Python 2.5?
- Looping menggunakan Metode Objek Python / IronPython
- Menemukan metode yang dimiliki objek
- Bagaimana cara melihat ke dalam objek Python?
- Bagaimana Saya Melakukan Introspeksi pada Objek dengan Python 2.x?
- Bagaimana cara mendapatkan daftar lengkap metode dan atribut objek?
- Mencari tahu fungsi mana yang tersedia dari instance kelas dengan python?
binding
works: stackoverflow.com/a/46041480/1959808[f for f in dir(ClassName) if not f.startswith('_')]
atau hanyadir(ClassName)
untuk semuanyaJawaban:
Contoh (daftar metode
optparse.OptionParser
kelas):Perhatikan bahwa
getmembers
mengembalikan daftar 2-tupel. Item pertama adalah nama anggota, item kedua adalah nilainya.Anda juga dapat mengirimkan instance ke
getmembers
:sumber
inspect.isroutine
mungkin predikat yang lebih tepat;inspect.ismethod
tidak bekerja untuk metode semua objek.Ada
dir(theobject)
metode untuk membuat daftar semua bidang dan metode objek Anda (sebagai tuple) dan modul inspeksi (sebagai penulisan codeape) untuk membuat daftar bidang dan metode dengan dokumen mereka (dalam "" ").Karena semuanya (bahkan bidang) dapat dipanggil dengan Python, saya tidak yakin ada fungsi bawaan untuk mendaftar hanya metode. Anda mungkin ingin mencoba jika objek yang Anda lewati
dir
dapat dipanggil atau tidak.sumber
Python 3.x menjawab tanpa pustaka eksternal
hasil pengecualian-dalang:
sumber
Katakanlah Anda ingin tahu semua metode yang terkait dengan kelas daftar. Cukup Ketikkan yang berikut
Di atas akan memberi Anda semua metode kelas daftar
sumber
print([ m for m in dir(my_class) if not m.startswith('__')])
Coba properti itu
__dict__
.sumber
__dict__
. Namun kelas memiliki__dict__
terlalu dan yang harus menampilkan metode kelas :)Anda juga dapat mengimpor FunctionType dari jenis dan mengujinya dengan
class.__dict__
:sumber
and not x.startswith('_')
pada akhir daftar pemahaman untuk saya gunakan untuk mengabaikan__init__
metode pribadi.import
dariFunctionType
dengan menggunakan lambda lembaran dengantype()
:type(lambda:0)
isinstance
akan lebih baik daripada ditype(y) == FunctionType
sini.Perhatikan bahwa Anda perlu mempertimbangkan apakah Anda ingin metode dari kelas dasar yang diwarisi (tetapi tidak diganti) termasuk dalam hasil. The
dir()
daninspect.getmembers()
operasi lakukan antara metode kelas dasar, tetapi penggunaan__dict__
atribut tidak.sumber
Ini juga berfungsi:
mymodule.py
Di file lain
keluaran:
Dari python docs:
inspect.isroutine (objek)
sumber
Begitu
Pikirkan Python halaman 210
sumber
Ada pendekatan ini:
Ketika berhadapan dengan instance kelas , mungkin akan lebih baik untuk mengembalikan daftar dengan referensi metode daripada hanya nama¹. Jika itu tujuan Anda, juga
import
__init__
) Dari daftarMungkin bermanfaat. Singkatnya, untuk kelas suka
Kita dapat memeriksa pengambilan contoh dengan
Jadi Anda bisa langsung menyebutnya:
¹ Kasus penggunaan:
Saya menggunakan ini untuk pengujian unit . Memiliki kelas di mana semua metode melakukan variasi dari proses yang sama - yang mengarah pada tes yang panjang, masing-masing hanya berjarak sedikit dari yang lain. KERING adalah mimpi yang jauh.
Pikir saya harus memiliki tes tunggal untuk semua metode, jadi saya membuat iterasi di atas.
Meskipun saya menyadari saya harus memperbaiki kode itu sendiri untuk menjadi KERING-tetap saja ... ini mungkin masih melayani jiwa nitpicky acak di masa depan.
sumber
Saya hanya menyimpan ini di sana, karena jawaban teratas tidak jelas .
Ini adalah tes sederhana dengan kelas tidak biasa berdasarkan Enum.
Dan ini adalah hasil keluaran.
Jadi apa yang kita miliki:
dir
berikan data tidak lengkapinspect.getmembers
memberikan data yang tidak lengkap dan memberikan kunci internal yang tidak dapat diaksesgetattr()
__dict__.keys()
memberikan hasil yang lengkap dan andalMengapa suara begitu keliru? Dan di mana saya salah? Dan di mana salah orang lain yang jawabannya memiliki suara sangat rendah?
sumber
memberikan daftar identik sebagai
tidak.
sumber
Anda bisa daftar semua metode dalam kelas python dengan menggunakan kode berikut
Ini akan mengembalikan daftar semua nama metode di kelas
sumber
Jika metode Anda adalah metode "biasa" dan bukan
statimethod
,classmethod
dll.Ada sedikit hack yang saya buat -
Ini dapat diperluas ke jenis metode lain dengan mengubah "fungsi" dalam
if
kondisi yang sesuai.Diuji pada python 2.7.
sumber
Saya tahu ini adalah posting lama, tetapi hanya menulis fungsi ini dan akan meninggalkannya di sini jika seseorang tersandung mencari jawaban:
sumber
Ini hanya sebuah pengamatan. "encode" tampaknya menjadi metode untuk objek string
Namun, jika str1 diperiksa untuk metode, daftar kosong dikembalikan
Jadi, mungkin saya salah, tetapi masalah ini tampaknya tidak sederhana.
sumber
'a'
adalah objek, yang tipenyastr
. Anda dapat melihat ini dengan menjalankantype('a')
.inspect.getmember()
mengambil parameter tipe, jadi Anda perlu meneleponinspect.getmember(str)
untuk melihat apa yang Anda harapkan.keluaran
sumber
Jika Anda ingin mendaftar hanya metode kelas python
sumber