如何覆盖此类中的函数?

时间:2013-02-25 02:32:00

标签: python pygal

我正在使用pygal库来创建图表,并希望覆盖一些函数,例如_tooltip_data函数等。对于初学者,我试图覆盖_title函数(要创建文本,我意识到我可以做:gau.title =“Blah Title”,但我想覆盖_title函数中的其他一些东西)。

我很丢失。为了创建一个Gauge图表,我创建了一个Gauge类,它来自MyGraph类,它继承自pypal的Graph类。如果我尝试创建MyGauge图表,那么我会收到错误:

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

这是我的代码,完成了我确定的大量错误。请记住,我仍然是一个新手(我可能没有告诉你,你可能只是通过查看我的代码猜测)。

import pygal, os 
from pygal.graph.graph import Graph
from pygal.graph.gauge import Gauge
from pygal.graph import CHARTS_NAMES

class MyGraph(Graph):

    def _title(self):
        """Make the title"""
        if self.title:
            for i, title_line in enumerate(self.title, 1):
                self.svg.node(
                    self.nodes['graph'], 'text', class_='title',
                    x=self.margin.left + self.view.width / 2,
                    y=i * (self.title_font_size + 10)
                ).text = "Hey, this is my Chart Title" # my addition

class MyGauge(MyGraph):
    pass


gauge_chart = pygal.MyGauge(human_readable=True,pretty_print=True) #@UndefinedVariable
gauge_chart.title = 'DeltaBlue V8 benchmark results'
gauge_chart.x_labels = ['Richards', 'DeltaBlue', 'Crypto', 'RayTrace', 'EarleyBoyer', 'RegExp', 'Splay', 'NavierStokes']
gauge_chart.range = [0, 10000]
gauge_chart.add('Chrome', 8212)
gauge_chart.add('Firefox', 8099)
gauge_chart.add('Opera', 2933)
gauge_chart.add('IE', 41)


png = 'gauge.png'
if os.path.isfile(png):
    os.remove(png)

gauge_chart.render_to_png(png)

我被困住了。我甚至试图创建一个MyPygal类,它来自pygal,所以我可以覆盖CHARTS_NAMES

class MyPygal(pygal):
    def __init__(self):
        CHARTS_NAMES = [
            'Line',
            'StackedLine',
            'XY',
            'Bar',
            'HorizontalBar',
            'StackedBar',
            'HorizontalStackedBar',
            'Pie',
            'Radar',
            'Funnel',
            'Pyramid',
            'VerticalPyramid',
            'Dot',
            'Gauge',
            'MyGauge' # my new chart type
        ]

我用“MyPygal.MyGauge”打电话但是我得到了错误:

TypeError: Error when calling the metaclass bases
    module.__init__() takes at most 2 arguments (3 given)

我是否在正确的轨道上?

1 个答案:

答案 0 :(得分:1)

如果您在自己的文件中创建自己的类,请不要尝试使用pygal.MyGauge引用它。使用pygal.前缀用于引用pygal库中的内容。但是你的MyGauge课程不是该课程的一部分;你自己创造了它。只需使用MyGauge(...)实例化您的课程。

另外,你为什么要创建MyGauge课程呢?它没有做任何事情。为什么不直接实例化MyGraph