Jak mogę uzyskać klasy nadrzędne klasy Python?
Jak mogę uzyskać klasy nadrzędne klasy Python?
Odpowiedzi:
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'>)
Jeśli chcesz wszystkich przodków, a nie tylko bezpośrednich, użyj inspect.getmro :
import inspect
print inspect.getmro(cls)
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 ;-).
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.
object
wydaje się , że nic po prostu dziedziczącego po nie odpowiada mro
.
x
, możemy uzyskać kolejność rozwiązywania metod z wywołaniem, type(x).mro()
które możemy rozważyć, jeśli x
ma ClassX
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__)
>>>
>>>
>>> import getpass
>>> getpass.GetPassWarning.__mro__
wyjścia, W ZAMÓWIENIU
(<class 'getpass.GetPassWarning'>, <type 'exceptions.UserWarning'>,
<type 'exceptions.Warning'>, <type 'exceptions.Exception'>,
<type 'exceptions.BaseException'>, <type 'object'>)
>>>
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 funkcji
Mam nadzieję, że to pomoże!
inspect.getmro
po prostu wywołuje __mro__
obiekt, jak widać na github.com/python/cpython/blob/… . Użycie getmro
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):
>>> some_object = "some_text"
>>> some_object.__class__.__bases__
(object,)
W przypadku mro w najnowszych wersjach języka Python:
>>> some_object = "some_text"
>>> some_object.__class__.__mro__
(str, object)
Oczywiście, gdy masz już definicję klasy, możesz po prostu wywołać __mro__
ją bezpośrednio:
>>> class A(): pass
>>> A.__mro__
(__main__.A, object)
type(C()).__bases__
opisane poniżej