Du müsstest Dich halt selbst durch die Vererbungshierarchie hangeln, denn das `__dict__` von `B` enthält nur die Sachen die in `B` definiert sind. Oder weniger, denn nicht alles muss in dem Attribut stecken! Ein Grund nicht selbst auf die ”magischen” Attribute zuzugreifen. Schau Dir mal die `dir()`-Funktion an. Da bekommst Du nicht nur von `B` beide Methoden, sondern sogar von `b`:
Code: Alles auswählen
In [40]: dir(B)
Out[40]:
['__class__',
'__delattr__',
'__dict__',
'__doc__',
'__format__',
'__getattribute__',
'__hash__',
'__init__',
'__module__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
'list_helps',
'testFn']
In [41]: dir(b)
Out[41]:
['__class__',
'__delattr__',
'__dict__',
'__doc__',
'__format__',
'__getattribute__',
'__hash__',
'__init__',
'__module__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
'list_helps',
'testFn']
Der Name `className` ist falsch, denn das ist nicht der Name der der Klasse, sondern tatsächlich die Klasse selbst! Da `class` als Name nicht geht ist die übliche Konvention einen Unterstrich anzuhängen: `class_`. Ausnahme sind Klassen die bei Methoden für `classmethod()` übergeben werden — das Argument heisst dort üblicherweise `cls`.
Vielleicht magst Du Dir auch mal das `inspect`-Modul anschauen:
Code: Alles auswählen
In [46]: inspect.getmembers(b, inspect.ismethod)
Out[46]:
[('list_helps',
<bound method B.list_helps of <__main__.B object at 0x7f0f1e628250>>),
('testFn', <bound method B.testFn of <__main__.B object at 0x7f0f1e628250>>)]
Und `inspect.getdoc()` ist vielleicht auch interessant.
Edit: Und das `pydoc`-Modul ist vielleicht auch interessant, denn darauf baut die eingebaute `help()`-Funktion auf.