在python中将容器添加到pre-exisiting对象的简单但正确的方法是什么?

Str*_*tch 1 python matplotlib

您如何建议将一个容器(如字典)添加到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)
Run Code Online (Sandbox Code Playgroud)

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

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

labels = [[[axis1_curve_1_label], [axis1_curve2_label]], [[axis2_curve1_label]]]
Run Code Online (Sandbox Code Playgroud)

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

data_ax[2].lines[3].labels = dict( text = '$\delta$', ndx = 30, leader_length = 15, leader_angle = 120)
Run Code Online (Sandbox Code Playgroud)

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

roi*_*ppi 5

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

class Holder:
    pass

my_holder = Holder()

my_holder.stuff = 'stuff'
Run Code Online (Sandbox Code Playgroud)

甚至

import itertools

itertools.bongos = 'BONGOS'
Run Code Online (Sandbox Code Playgroud)

你应该这样做吗?可能不是.它会严重混淆你的代码.如果你是唯一一个看过你的代码的人,你可以侥幸逃脱,但这并不是一个好习惯.只是利用python集合dict,tuple就像它们本来应该被使用一样.你隐秘地dict在你的例子中使用a ,也可以明确地使用一个将Line2D对象映射到它们各自的标签上.

l2d_labels = {}
l2d_labels[line2D_obj] = labels #labels having previously been defined
Run Code Online (Sandbox Code Playgroud)

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

from collections import namedtuple
ll2D = namedtuple('Labeled_line2D',['line2D_obj','labels'])
Run Code Online (Sandbox Code Playgroud)

现在你可以根据ll2D需要制作任意数量的对象,任何一个人来看看其中一个对象就会看到它究竟是什么:一个line2D与它配对的对象labels.