2013-10-15 32 views
1

你會如何建議將一個容器(如字典)添加到python中的預先存在的對象?我只是瞎搞與matplotlib一個Line2D對象,我發現我可以通過下面的方法添加一個詞典什麼是簡單而正確的方式來添加一個容器到python中的一個現存對象?

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

在'__init__'中創建屬性'self.foo = {}'的正常方法實際上是在做與你在這裏完全相同的事情。區別在於人們希望看到'__init__'中創建的屬性,但不希望在類定義之外的某些隨機代碼中看到它們。 – abarnert

回答

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配對。

+0

你應該明確地說使用'Line2D'對象作爲鍵。 – tacaswell

+0

@tcaswell okidoke。 – roippi

+0

謝謝。我認爲這就是你所暗示的,如果我錯了,並且遇到了不必要的專橫,但是如果那是你所暗示的我不想發佈幾乎相同的答案。 – tacaswell

相關問題