在python中将容器添加到预先存在的对象的简单但正确的方法是什么?

时间:2013-10-15 04:02:57

标签: python matplotlib

您如何建议在python中的预先存在的对象中添加容器(如字典)?我只是在使用matplotlib中的Line2D对象,我发现我可以通过以下方法添加字典

import matplotlib as mpl
line2D_obj = mpl.lines.Line2D([0,1], [0,0])
line2D_obj.labels = dict( text = '$\delta$', ndx = 30, leader_length = 15, leader_angle = 120)

line2D_obj在实例化时没有方法.labels。我刚刚创建了.labels,因为我想在Line2D对象中存储一些数据。这是一个好方法吗?如果没有,你还有什么建议吗?

如果它很重要,我调查的原因是我正在尝试创建一个自定义函数来标记matplotlib中的Line2D个对象。以前,我以为我只是将标签函数交给一堆嵌套列表,a.la。

labels = [[[axis1_curve_1_label], [axis1_curve2_label]], [[axis2_curve1_label]]]

但这很麻烦,很难遵循。我现在认为有更好的方法。我的绘图代码将数据轴输出为名为data_ax的轴列表,因此Line2D对象很好地组织成一个名为lines的列表。例如,如果我想在数据轴2上标记曲线3,我只需键入

即可
data_ax[2].lines[3].labels = dict( text = '$\delta$', ndx = 30, leader_length = 15, leader_angle = 120)

很清楚我标注的是哪条曲线。然后我可以将data_ax对象传递给我的标签功能,它可以为每条曲线选择标签信息。

1 个答案:

答案 0 :(得分:5)

您可以使用__dict__属性的任何对象执行此操作。即:

class Holder:
    pass

my_holder = Holder()

my_holder.stuff = 'stuff'

甚至

import itertools

itertools.bongos = 'BONGOS'

你应该这样做吗?可能不是。它会严重混淆你的代码。如果你是唯一一个看过代码的人,你就可以逃脱它,但这并不是一个好习惯。只需使用像dicttuple这样的python集合,就像它们本来要使用的那样。您在示例中秘密使用了dict,也可以明确地使用一个将Line2D对象映射到各自的标签上。

l2d_labels = {}
l2d_labels[line2D_obj] = labels #labels having previously been defined

甚至是namedtuple,它指定了您正在创建的对象的松散合约:

from collections import namedtuple
ll2D = namedtuple('Labeled_line2D',['line2D_obj','labels'])

现在你可以根据需要制作尽可能多的ll2D个对象,任何出现并查看其中一个对象的人都会看到它究竟是什么:一个line2D对象与它配对labels