Belirli bir sınıfın hiyerarşisindeki tüm temel sınıfları listelemek mi?


Yanıtlar:


196

inspect.getmro(cls)hem yeni hem de eski stil sınıfları için çalışır ve şununla aynı şeyi döndürür NewClass.mro(): yöntem çözümlemesi için kullanılan sırayla, sınıfın ve tüm üst sınıfların bir listesi.

>>> class A(object):
>>>     pass
>>>
>>> class B(A):
>>>     pass
>>>
>>> import inspect
>>> inspect.getmro(B)
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)

2
Pyobjc sınıfları için çalışmaz :( File "/Users/rbp/Projects/zzzzzzz/macmdtypes.py", satır 70, in coerce print inspect.getmro (yol) Dosya "/System/Library/Frameworks/Python.framework/ / 2.7 / lib / python2.7 / inspect.py ", satır 348, getmro arama tabanlarında (cls, sonuç) Dosya" /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect .py ", satır 339, cls .__ bases_ içindeki taban için _searchbases içinde : AttributeError: ' NSTaggedDate' nesnesinin '__bases ' özniteliği yok
rbp

17
@rbp Karşılaştığım sorunun aynısını yaşadığından şüpheleniyorum: inspect.getmro(obj)yerine yapmaya çalışıyordun inspect.getmro(type(obj)).
esmit

44

Bkz __bases__özelliğini piton geçerli classbazlar sınıfların bir demet içerir:

>>> 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>]

5
Bu, kopyaları ortaya çıkarabilir. Ve bu nedenle dokümantasyonda getmroaçıkça "Hiçbir sınıf bu dizide birden fazla görünmüyor" diyor?
Sridhar Ratnakumar

10
Dikkat, __bases__sadece bir seviye yukarı çıkar . (Yinelemeli yardımcı programınızın ima ettiği gibi, ancak örneğe üstünkörü bir bakış bunu anlayamayabilir.)
Bob Stein

32

inspect.getclasstree()sınıfların ve tabanlarının iç içe geçmiş bir listesini oluşturacaktır. Kullanımı:

inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.

1
Oh güzel. Daha da güzel çıktılar için pprint kullanın! python -c 'import inspect; from pprint import pprint as pp; pp(inspect.getclasstree(inspect.getmro(IOError)))'
penguin359

20

__bases__sınıf nesnesinin demetini kullanabilirsiniz :

class A(object, B, C):
    def __init__(self):
       pass
print A.__bases__

Tarafından döndürülen demet __bases__tüm temel sınıflarına sahiptir.

Umarım yardımcı olur!


Sınıfınız bir sınıftan miras alan bir sınıftan miras alıyorsa, zincirin yalnızca ilk kısmı onun içinde olacaktır__bases__
Boris

Tek bir işlev için tüm modülü içe aktarmadan basit ve temiz.
Temperosa

8

Python 3.7'de inspect'i içe aktarmanıza gerek yoktur, type.mro size sonucu verecektir.

>>> class A:
...   pass
... 
>>> class B(A):
...   pass
... 
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>

python 3.x'te her sınıfın temel nesne sınıfından miras aldığına dikkat edin.


8

Göre Python doc , biz de sadece kullanabilirsiniz class.__mro__Özellik veya class.mro()yöntem:

>>> 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

2

Jochen'in cevabı çok yararlı ve doğru olsa da, sınıf hiyerarşisini inspect modülünün .getmro () yöntemini kullanarak elde edebileceğinizden, Python'un kalıtım hiyerarşisinin aşağıdaki gibi olduğunu vurgulamak da önemlidir:

örn:

class MyClass(YourClass):

Miras alan bir sınıf

  • Çocuk sınıfı
  • Türetilmiş sınıf
  • Alt sınıf

örn:

class YourClass(Object):

Miras alınan bir sınıf

  • Ebeveyn sınıfı
  • Temel sınıf
  • üst sınıf

Bir sınıf diğerinden miras alabilir - Nitelikli sınıf miras alınır - özellikle yöntemleri miras alınır - bu, miras alan (alt) sınıfın örneklerinin miras alınan (üst) sınıfın özniteliğine erişebileceği anlamına gelir

örnek -> sınıf -> sonra devralınan sınıflar

kullanma

import inspect
inspect.getmro(MyClass)

size Python içindeki hiyerarşiyi gösterecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.