2015-03-12 5 views
1


Я хочу продлить мой класс питона с модулем pyplot из Matplotlib:Расширение класса питона с модулем

import matplotlib.pyplot as plt 

class MyClass(object, plt): 
    pass 

Это не работает:

TypeError: Error when calling the metaclass bases
metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

Я нашел this вопрос, но на самом деле , это не помогло мне. Я ищу с

>>> type(matplotlib) 
>>> type(matplotlib.pyplot) 

и т. Д. Для классов, но я получаю только модули. Документация API ничего не говорит о классе. Итак, что я делаю неправильно? Я все еще очень новичок в python ...

Спасибо заранее!
-ju-

+0

* «Я хочу, чтобы расширить свой класс питона с модулем pyplot из Matplotlib» * - почему? Что вы пытаетесь достичь здесь? – jonrsharpe

+0

Я хочу расширить модуль pyplot несколькими функциями, которые я часто использую с pyplot. –

+0

Итак, опять же, почему вы хотите унаследовать его? Почему бы просто не создать собственный модуль, который импортирует «pyplot» и определяет дополнительную функциональность, которую вы хотите? – jonrsharpe

ответ

0

Характер ошибки вы получаете просто потому, что вы не можете иметь класс наследует от обоих «объекта» и matplotlib.pyplot - но их, pyplot является модуль - То есть: экземпляр класса «ModuleType», и нет смысла пытаться увеличить его с наследованием.

Вы могли бы увеличить pyplot с простыми заданиями атрибутов:

import matplotlib.pyplot 

def my_new_plot_function(...): 
    ... 

matplotlib.pyplot.new_func = my_new_plot_function 

и ваша новая функция будет доступна для других модулей, использующих модуль pyplot. Однако, как указано в комментариях, нет необходимости делать это - и это определенно нежелательно с архитектурной точки зрения. Вы даже можете заменить одну из существующих функций или классов в модуле pyplot, делая это - это называется патчем для обезьян - и вы обнаружите, что это будет крайне ненадежным, если вы действительно не знаете, что делаете, и даже в этом случае плохо поддерживаемы , и неясной особенностью в вашей системе в целом.

Теперь есть классы внутри модуля Pyplot - вы можете наследовать их и улучшать их поведение - и вы импортируете унаследованные классы в свой код из своего собственного модуля. Возможно, наследование - это не лучший способ добавить свое поведение в современный код (предпочтительным является агрегация и проксирование необходимых методов), но это сработает.

Классы, которые могут быть подклассы являются:

>>> [obj for obj in dir(pyplot) if isinstance(getattr(pyplot, obj), type)] 
['Annotation', 'Arrow', 'Artist', 'AutoLocator', 'Axes', 'Button', 'Circle', 'Figure', 'FigureCanvasBase', 'FixedFormatter', 'FixedLocator', 'FormatStrFormatter', 'Formatter', 'FuncFormatter', 'GridSpec', 'IndexLocator', 'Line2D', 'LinearLocator', 'Locator', 'LogFormatter', 'LogFormatterExponent', 'LogFormatterMathtext', 'LogLocator', 'MaxNLocator', 'MultipleLocator', 'Normalize', 'NullFormatter', 'NullLocator', 'PolarAxes', 'Polygon', 'Rectangle', 'ScalarFormatter', 'Slider', 'Subplot', 'SubplotTool', 'Text', 'TickHelper', 'Widget', 'silent_list'] 
+0

Благодарим вас за хорошее объяснение, это очень полезно. –

Смежные вопросы