Jak mogę uzyskać klasy nadrzędne klasy Python?
202
Użyj następującego atrybutu:
cls.__bases__
Z dokumentów :
Krotka klas podstawowych obiektu klasy.
Przykład:
>>> str.__bases__
(<type 'basestring'>,)
Inny przykład:
>>> class A(object):
... pass
...
>>> class B(object):
... pass
...
>>> class C(A, B):
... pass
...
>>> C.__bases__
(<class '__main__.A'>, <class '__main__.B'>)
type(C()).__bases__
opisane poniżejJeśli chcesz wszystkich przodków, a nie tylko bezpośrednich, użyj inspect.getmro :
Przydatnie, daje to wszystkie klasy przodków w „kolejności rozpoznawania metod” - tj. W kolejności, w której przodkowie będą sprawdzani podczas rozwiązywania metody (lub w rzeczywistości dowolnego innego atrybutu - metody i inne atrybuty żyją w tej samej przestrzeni nazw w końcu w Pythonie ;-).
źródło
cls.__mro__
(przynajmniej w Pythonie 3.5)Klasy w nowym stylu mają metodę mro, którą można wywołać, która zwraca listę klas nadrzędnych w kolejności rozwiązywania metod.
źródło
object
wydaje się , że nic po prostu dziedziczącego po nie odpowiadamro
.x
, możemy uzyskać kolejność rozwiązywania metod z wywołaniem,type(x).mro()
które możemy rozważyć, jeślix
maClassX
jako klasę podstawową z:ClassX in type(x).mro()
Najszybszy sposób, aby zobaczyć wszystkich rodziców i NA ZAMÓWIENIE , wystarczy użyć wbudowanego
__mro__
to znaczy
repr(YOUR_CLASS.__mro__)
wyjścia, W ZAMÓWIENIU
Masz to. „Najlepsza” odpowiedź ma teraz 182 głosy (jak to piszę), ale jest to TAK O wiele prostsze niż niektóre skomplikowane pętle, patrząc na podstawy jednej klasy na raz, nie wspominając o tym, kiedy klasa rozszerza DWA lub więcej rodziców zajęcia
inspect
Niepotrzebne importowanie i używanie tylko chmur powoduje, że zakres jest niepotrzebny. Szkoda, że ludzie nie wiedzą, jak korzystać z wbudowanych funkcjiMam nadzieję, że to pomoże!
źródło
inspect.getmro
po prostu wywołuje__mro__
obiekt, jak widać na github.com/python/cpython/blob/… . Użyciegetmro
tworzy czystszy i bardziej czytelny kod. Chociaż pomijanie wywołania funkcji jest rzeczywiście szybsze.Użyj baz, jeśli chcesz tylko zdobyć rodziców, użyj
__mro__
(jak wskazał @ naught101), aby uzyskać kolejność rozwiązywania metod (aby wiedzieć, w jakiej kolejności zostały wykonane init).Podstawy (i pierwsze uzyskanie klasy dla istniejącego obiektu):
W przypadku mro w najnowszych wersjach języka Python:
Oczywiście, gdy masz już definicję klasy, możesz po prostu wywołać
__mro__
ją bezpośrednio:źródło
Jeśli chcesz mieć pewność, że wszystkie zostaną wywołane, użyj
super
na wszystkich poziomach.źródło