2012-07-27 5 views
18

Il codiceC'è un matplotlib.axes.AxesSubplot classe, ma le matplotlib.axes modulo ha alcun attributo AxesSubplot

import matplotlib.pyplot as plt 
fig = plt.figure() 
ax = fig.add_subplot(111) 
print type(ax) 

dà l'uscita

<class 'matplotlib.axes.AxesSubplot'> 

Quindi il codice

import matplotlib.axes 
matplotlib.axes.AxesSubplot 

solleva l'eccezione

AttributeError: 'module' object has no attribute 'AxesSubplot' 

Per riassumere, esiste una classe matplotlib.axes.AxesSubplot, ma il modulo matplotlib.axes non ha attributo AxesSubplot. Cosa diavolo sta succedendo?

Sto usando Matplotlib 1.1.0 e Python 2.7.3.

+0

C'è un problema reale che si sta cercando di risolvere con questo, o questa domanda è solo curiosità? – Julian

+3

@ Julian: È "solo curiosità". Credo che la curiosità ti renda uno sviluppatore migliore. – user763305

risposta

19

Heh. Questo perché è no AxesSubplot classe .. fino a quando uno è necessario, quando uno è stato creato da SubplotBase. Questo viene fatto qualche magia in axes.py:

def subplot_class_factory(axes_class=None): 
    # This makes a new class that inherits from SubplotBase and the 
    # given axes_class (which is assumed to be a subclass of Axes). 
    # This is perhaps a little bit roundabout to make a new class on 
    # the fly like this, but it means that a new Subplot class does 
    # not have to be created for every type of Axes. 
    if axes_class is None: 
     axes_class = Axes 

    new_class = _subplot_classes.get(axes_class) 
    if new_class is None: 
     new_class = new.classobj("%sSubplot" % (axes_class.__name__), 
           (SubplotBase, axes_class), 
           {'_axes_class': axes_class}) 
     _subplot_classes[axes_class] = new_class 

    return new_class 

Così è fatta al volo, ma è una sottoclasse di SubplotBase:

>>> import matplotlib.pyplot as plt 
>>> fig = plt.figure() 
>>> ax = fig.add_subplot(111) 
>>> print type(ax) 
<class 'matplotlib.axes.AxesSubplot'> 
>>> b = type(ax) 
>>> import matplotlib.axes 
>>> issubclass(b, matplotlib.axes.SubplotBase) 
True 
+1

Non dovrebbe essere creata la classe allora quando eseguo il primo snippet di codice ed è presente come attributo di matplotlib.axes quando eseguo il secondo snippet di codice? – user763305

+3

È * creato *, ma non è memorizzato a livello di modulo. Guarda in 'matplotlib.axes._subplot_classes': dovresti vedere' {matplotlib.axes.Axes: matplotlib.axes.AxesSubplot} '. Notare che nella funzione factory il 'new_class' viene aggiunto al dizionario' _subplot_classes'. – DSM

Problemi correlati