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?
python
class
inheritance
oop
introspection
Sridhar Ratnakumar
źródło
źródło
inspect.getmro(obj)
zamiast tego próbowałeśinspect.getmro(type(obj))
.Zobacz
__bases__
właściwość dostępną w Pythonieclass
, 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>]
źródło
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.
źródło
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!
źródło
__bases__
>>> 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.
źródło
Zgodnie z dokumentacją Pythona możemy też po prostu użyć
class.__mro__
atrybutu lubclass.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
źródło
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.
źródło