Diberikan kelas Foo
(apakah itu kelas gaya baru atau tidak), bagaimana Anda menghasilkan semua kelas dasar - di mana saja dalam hierarki warisan - issubclass
dari mana?
Diberikan kelas Foo
(apakah itu kelas gaya baru atau tidak), bagaimana Anda menghasilkan semua kelas dasar - di mana saja dalam hierarki warisan - issubclass
dari mana?
Jawaban:
inspect.getmro(cls)
bekerja untuk kelas gaya baru dan lama dan mengembalikan sama dengan NewClass.mro()
: daftar kelas dan semua kelas leluhurnya, dalam urutan yang digunakan untuk resolusi metode.
>>> class A(object):
>>> pass
>>>
>>> class B(A):
>>> pass
>>>
>>> import inspect
>>> inspect.getmro(B)
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
inspect.getmro(obj)
bukan inspect.getmro(type(obj))
.
Lihat __bases__
properti yang tersedia di python class
, yang berisi tuple kelas pangkalan:
>>> def classlookup(cls):
... c = list(cls.__bases__)
... for base in c:
... c.extend(classlookup(base))
... return c
...
>>> class A: pass
...
>>> class B(A): pass
...
>>> class C(object, B): pass
...
>>> classlookup(C)
[<type 'object'>, <class __main__.B at 0x00AB7300>, <class __main__.A at 0x00A6D630>]
getmro
secara eksplisit mengatakan "Tidak ada kelas yang muncul lebih dari satu kali dalam tuple ini"?
__bases__
hanya naik satu level . (Seperti utilitas rekursif Anda menyiratkan, tetapi pandangan sekilas pada contoh mungkin tidak mengambil itu.)
inspect.getclasstree()
akan membuat daftar kelas dan basisnya. Pemakaian:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
python -c 'import inspect; from pprint import pprint as pp; pp(inspect.getclasstree(inspect.getmro(IOError)))'
Anda bisa menggunakan __bases__
tuple dari objek kelas:
class A(object, B, C):
def __init__(self):
pass
print A.__bases__
Tuple yang dikembalikan oleh __bases__
memiliki semua kelas dasarnya.
Semoga ini bisa membantu!
__bases__
Di python 3.7 Anda tidak perlu mengimpor inspect, type.mro akan memberi Anda hasilnya.
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>
perhatikan bahwa dengan python 3.x setiap kelas mewarisi dari kelas objek dasar.
Menurut dokumen Python , kita juga bisa menggunakan class.__mro__
atribut atau class.mro()
metode:
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
>>> A.__mro__
(<class '__main__.A'>, <class 'object'>)
>>> object.__mro__
(<class 'object'>,)
>>>
>>> B.mro()
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>> A.mro()
[<class '__main__.A'>, <class 'object'>]
>>> object.mro()
[<class 'object'>]
>>> A in B.mro()
True
Meskipun jawaban Jochen sangat membantu dan benar, karena Anda dapat memperoleh hierarki kelas menggunakan metode .getmro () pada modul inspect, penting juga untuk menyoroti bahwa hierarki warisan Python adalah sebagai berikut:
ex:
class MyClass(YourClass):
Kelas warisan
ex:
class YourClass(Object):
Kelas yang diwarisi
Satu kelas dapat mewarisi dari yang lain - Kelas yang diatribusikan diwarisi - khususnya, metodenya diwarisi - ini berarti bahwa instance dari kelas pewarisan (anak) dapat mengakses yang dikaitkan dengan kelas yang diwarisi (induk)
instance -> class -> kemudian kelas yang diwarisi
menggunakan
import inspect
inspect.getmro(MyClass)
akan menunjukkan kepada Anda hierarki, dalam Python.