Bagaimana saya bisa mendapatkan kelas induk dari kelas Python?
202
Gunakan atribut berikut:
cls.__bases__
Dari dokumen :
Tupel kelas dasar dari objek kelas.
Contoh:
>>> str.__bases__
(<type 'basestring'>,)
Contoh lain:
>>> class A(object):
... pass
...
>>> class B(object):
... pass
...
>>> class C(A, B):
... pass
...
>>> C.__bases__
(<class '__main__.A'>, <class '__main__.B'>)
type(C()).__bases__
seperti yang disebutkan lebih lanjut di bawah iniJika Anda menginginkan semua leluhur daripada yang langsung, gunakan inspect.getmro :
Berguna, ini memberi Anda semua kelas leluhur dalam "metode resolusi urutan" - yaitu urutan di mana leluhur akan diperiksa ketika menyelesaikan metode (atau, sebenarnya, atribut lainnya - metode dan atribut lainnya hidup di namespace yang sama dalam Python, setelah semua ;-).
sumber
cls.__mro__
(setidaknya dalam Python 3.5)Kelas gaya baru memiliki metode mro yang dapat Anda panggil yang mengembalikan daftar kelas induk dalam urutan resolusi metode.
sumber
object
tampaknya tidak meresponsmro
.x
, kita bisa mendapatkan urutan resolusi metode dengan panggilan yangtype(x).mro()
dapat kita pertimbangkan jikax
memilikiClassX
sebagai kelas dasar dengan:ClassX in type(x).mro()
Cara TERCEPAT , untuk melihat semua orang tua, dan DI ORDER , cukup gunakan built in
__mro__
yaitu
repr(YOUR_CLASS.__mro__)
output, DALAM PESANAN
Itu dia. Jawaban "terbaik" saat ini, memiliki 182 suara (saat saya mengetik ini) tetapi ini SO jauh lebih sederhana daripada beberapa yang berbelit-belit untuk loop, melihat ke basis pangkalan satu kelas pada suatu waktu, belum lagi ketika sebuah kelas memperpanjang DUA atau lebih induk kelas. Mengimpor dan menggunakan
inspect
hanya cloud cakupannya tidak perlu. Sejujurnya itu memalukan orang tidak tahu untuk hanya menggunakan built-inSaya harap ini membantu!
sumber
inspect.getmro
hanya memanggil__mro__
objek, seperti yang Anda lihat di github.com/python/cpython/blob/… . Menggunakangetmro
menghasilkan kode yang lebih bersih dan lebih mudah dibaca. Meskipun melewatkan panggilan fungsi memang lebih cepat.Gunakan basis jika Anda hanya ingin mendapatkan orang tua, gunakan
__mro__
(seperti yang ditunjukkan oleh @ naught101) untuk mendapatkan urutan resolusi metode (jadi untuk mengetahui di mana urutan init dieksekusi).Basis (dan pertama mendapatkan kelas untuk objek yang ada):
Untuk mro dalam versi Python terbaru:
Jelas, ketika Anda sudah memiliki definisi kelas, Anda bisa langsung menyebutnya
__mro__
:sumber
Jika Anda ingin memastikan mereka semua dipanggil, gunakan
super
di semua level.sumber