1

您如何建议将容器(例如字典)添加到 python 中的预先存在的对象?我只是在搞乱Line2Dmatplotlib中的一个对象,我发现我可以通过以下方法添加字典

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对象中存储一些数据。这是一个好方法吗?如果没有,你还有什么建议?

万一这很重要,我正在研究这个的原因是我正在尝试创建一个自定义函数来标记Line2Dmatplotlib 中的对象。以前,我想我只是将我的标签函数交给一堆嵌套列表,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对象传递给我的标签函数,它可以为每条曲线挑选标签信息。

4

1 回答 1

5

您可以对任何具有__dict__属性的对象执行此操作。以机智:

class Holder:
    pass

my_holder = Holder()

my_holder.stuff = 'stuff'

甚至

import itertools

itertools.bongos = 'BONGOS'

你应该这样做吗?可能不是。它极大地混淆了您的代码。如果你是唯一一个看过你的代码的人,你可以摆脱它,但这不是一个好习惯。只需利用 python 集合dicttuple就像它们注定要使用的那样。您dict在示例中暗中使用 a ,不妨明确使用 one 将Line2D对象映射到它们各自的标签上。

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

甚至是 a namedtuple,它为您正在创建的对象指定一个松散的合同:

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

现在你可以根据ll2D需要制作任意数量的对象,任何出现并查看其中一个对象的人都会确切地看到它是什么:一个line2D对象与其配对labels

于 2013-10-15T04:14:45.820 回答