Подтвердить что ты не робот

Существует класс matplotlib.axes.AxesSubplot, но модуль matplotlib.axes не имеет атрибута AxesSubplot

Код

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

дает выход

<class 'matplotlib.axes.AxesSubplot'>

Тогда код

import matplotlib.axes
matplotlib.axes.AxesSubplot

вызывает исключение

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

Подводя итог, существует класс matplotlib.axes.AxesSubplot, но модуль matplotlib.axes не имеет атрибута AxesSubplot. Что происходит дальше?

Я использую Matplotlib 1.1.0 и Python 2.7.3.

4b9b3361

Ответ 1

Хех. Это потому, что нет класса AxesSubplot.. до тех пор, пока не потребуется, когда он создан из SubplotBase. Это делается с помощью некоторой магии в 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

Так что это сделано на лету, но это подкласс 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