您如何建议在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
对象传递给我的标签功能,它可以为每条曲线选择标签信息。
答案 0 :(得分:5)
您可以使用__dict__
属性的任何对象执行此操作。即:
class Holder:
pass
my_holder = Holder()
my_holder.stuff = 'stuff'
甚至
import itertools
itertools.bongos = 'BONGOS'
你应该这样做吗?可能不是。它会严重混淆你的代码。如果你是唯一一个看过代码的人,你就可以逃脱它,但这并不是一个好习惯。只需使用像dict
和tuple
这样的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
。