【问题标题】:How do I override functions in this class?如何覆盖此类中的函数?
【发布时间】:2013-02-25 02:32:00
【问题描述】:

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

我很迷茫。为了创建 Gauge 图表,我创建了一个 Gauge 类,它继承自 MyGraph 类,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)

我是否走在正确的轨道上?

【问题讨论】:

    标签: python pygal


    【解决方案1】:

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

    另外,你为什么要创建MyGauge 类?它什么也没做。为什么不直接实例化MyGraph

    【讨论】:

    • 由于 pygal 的 Gauge 类继承自他们的 Graph 类,我认为 MyGauge 必须继承自 MyGraph 以便 MyGauge 图表基于 MyGraph,不是吗?
    • @Mr.Gaga:问题是你想让MyGauge 做什么,而MyGraph 还没有做到。你现在拥有它的方式,MyGauge 不提供自己的功能;它只是MyGraph 的多余包装。大概在pygal 中,Gauge 类为Graph 类添加了一些东西,这就是为什么有两个类。但是,如果您只需要做一个类的自定义值,则无需创建两个类。类的名称没有任何意义。重要的是类中的代码。
    • @Mr.Gaga:我不知道,因为我不熟悉pygal,我真的不知道你想做什么。如果我的建议修复了错误,那么您应该继续开发您的课程,直到它完成您想要的,无论是什么。
    • @Mr.Gaga:就像我说的,在你有pygal.MyGauge(human_readable=True,pretty_print=True)的地方,把它改成MyGauge(human_readable=True,pretty_print=True)
    • @Mr.Gaga:好的,但无论如何这都是进步,因为至少你遇到了一个与你实际定义班级的方式有关的错误。可能是时候就该错误提出另一个问题了。 human_readablepygal.Graph 已经接受并知道的东西吗?如果没有,你需要在你的类上定义它。在尝试从现有库扩展类之前,我建议您尝试一些更简单的练习,只需创建几个相互继承的类,以了解如何在 Python 中进行类继承。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 2018-12-21
    • 2018-12-23
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多