Bagaimana saya bisa mendapatkan kelas induk dari kelas Python?
Bagaimana saya bisa mendapatkan kelas induk dari kelas Python?
Jawaban:
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'>)
Jika Anda menginginkan semua leluhur daripada yang langsung, gunakan inspect.getmro :
import inspect
print inspect.getmro(cls)
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 ;-).
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.
object
tampaknya tidak merespons mro
.
x
, kita bisa mendapatkan urutan resolusi metode dengan panggilan yang type(x).mro()
dapat kita pertimbangkan jika x
memiliki ClassX
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__)
>>>
>>>
>>> import getpass
>>> getpass.GetPassWarning.__mro__
output, DALAM PESANAN
(<class 'getpass.GetPassWarning'>, <type 'exceptions.UserWarning'>,
<type 'exceptions.Warning'>, <type 'exceptions.Exception'>,
<type 'exceptions.BaseException'>, <type 'object'>)
>>>
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-in
Saya harap ini membantu!
inspect.getmro
hanya memanggil __mro__
objek, seperti yang Anda lihat di github.com/python/cpython/blob/… . Menggunakan getmro
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):
>>> some_object = "some_text"
>>> some_object.__class__.__bases__
(object,)
Untuk mro dalam versi Python terbaru:
>>> some_object = "some_text"
>>> some_object.__class__.__mro__
(str, object)
Jelas, ketika Anda sudah memiliki definisi kelas, Anda bisa langsung menyebutnya __mro__
:
>>> class A(): pass
>>> A.__mro__
(__main__.A, object)
Jika Anda ingin memastikan mereka semua dipanggil, gunakan super
di semua level.
type(C()).__bases__
seperti yang disebutkan lebih lanjut di bawah ini