Biorąc pod uwagę klasę Foo
(niezależnie od tego, czy jest to klasa w nowym stylu, czy nie), w jaki sposób można wygenerować wszystkie klasy podstawowe - w dowolnym miejscu w hierarchii dziedziczenia - issubclass
z?
Biorąc pod uwagę klasę Foo
(niezależnie od tego, czy jest to klasa w nowym stylu, czy nie), w jaki sposób można wygenerować wszystkie klasy podstawowe - w dowolnym miejscu w hierarchii dziedziczenia - issubclass
z?
Odpowiedzi:
inspect.getmro(cls)
działa zarówno dla klas nowego, jak i starego stylu i zwraca to samo, co NewClass.mro()
: lista klasy i wszystkich jej klas przodków, w kolejności używanej do rozwiązywania metod.
>>> class A(object):
>>> pass
>>>
>>> class B(A):
>>> pass
>>>
>>> import inspect
>>> inspect.getmro(B)
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
inspect.getmro(obj)
zamiast tego próbowałeś inspect.getmro(type(obj))
.
Zobacz __bases__
właściwość dostępną w Pythonie class
, która zawiera krotkę klas bazowych:
>>> 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
wyraźnie mówi: „Żadna klasa nie pojawia się więcej niż raz w tej krotce”?
__bases__
tylko jeden poziom w górę . (Jak sugeruje twoja rekurencyjna użyteczność, ale pobieżne spojrzenie na przykład może tego nie wykryć.)
inspect.getclasstree()
utworzy zagnieżdżoną listę klas i ich baz. Stosowanie:
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)))'
możesz użyć __bases__
krotki obiektu klasy:
class A(object, B, C):
def __init__(self):
pass
print A.__bases__
Krotka zwrócona przez __bases__
ma wszystkie swoje klasy bazowe.
Mam nadzieję, że to pomoże!
__bases__
W Pythonie 3.7 nie musisz importować inspect, type.mro da ci wynik.
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>
uwaga, że w Pythonie 3.x każda klasa dziedziczy po podstawowej klasie obiektu.
Zgodnie z dokumentacją Pythona możemy też po prostu użyć class.__mro__
atrybutu lub class.mro()
metody:
>>> 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
Chociaż odpowiedź Jochena jest bardzo pomocna i poprawna, ponieważ hierarchię klas można uzyskać za pomocą metody .getmro () modułu inspect, należy również podkreślić, że hierarchia dziedziczenia w Pythonie jest następująca:
dawny:
class MyClass(YourClass):
Klasa dziedzicząca
dawny:
class YourClass(Object):
Klasa dziedziczona
Jedna klasa może dziedziczyć po innej - Klasa „atrybuty” jest dziedziczona - w szczególności jej metody są dziedziczone - oznacza to, że instancje klasy dziedziczącej (podrzędnej) mogą uzyskać dostęp przypisany do klasy dziedziczonej (nadrzędnej)
instancja -> klasa -> następnie dziedziczone klasy
za pomocą
import inspect
inspect.getmro(MyClass)
pokaże hierarchię w Pythonie.