Nicht immer, m.W. nur, wenn a.__class__.b eine ungebundene Methode ist (Python 2.x, in Python 3.0 evtl. anders). Jedenfalls geht es nicht mit gebundenen Methoden, built-in functions und Klassen. Vielleicht sind doch nicht alle callables so ähnlich, wie mancher meint.
Hä? Ich hab doch auch von ungebundenen Methoden geredet. Wenn du die gebundene Methode "b" einer Instanz a aufrufst, wird das umgewandelt in <Klasse von a>.<ungebundene Methode b>(a). Und <Klasse von a> konnte ich oben besser durch "a.__class__" darstellen. Also a.__class__.b(a). Das trifft natürlich nicht auf alle Callables zu.
Hm, eine Metaklasse ist doch üblicherweise eine Klasse, die von type erbt? (Genauer: Die Instanzen der Metaklasse sind Klassen - wie bei type eben.)
Genau. Die Standard Metaklasse type besitzt eine ungebundene __call__ Methode. Eine Instanz (also eine "normale" Klasse) von type hat also eine "gebundene __call__ Methode". Sobald man eine solche Klasse instanziieren will, wird bei einem Aufruf der Form
__call__ aufgerufen. __call__ sorgt dafür, das der Konstruktor __new__ der Klasse und deren __init__ Methode aufgerufen wird. So könnte man mit einer Metaklasse den Aufruf von __init__ für jede neue Instanz einer Klasse (der Metaklasse) abstellen.
Und nochmal: Wenn Methoden und Funktionen dasselbe sind, warum sollte man dann Funktionen importieren können, aber keine Methoden?
Klar sollte man es tun können. Macht aber wenig Sinn. Wenn du eine ungebundene importierst musst du sowieso für die Instanz sorgen und ansonsten kannst du nur von einer in einem Modul global gespeicherten Instanz einer Klasse auf eine gebundene Methode zugreifen. Und wozu sollte man deren Methoden irgendwo rumreichen? Zumal sowas imho sowieso komisch riecht.