1

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作成しました。これは良いアプローチですか?そうでない場合、他に何を提案しますか?.labelsLine2D

Line2D重要な場合、これを調査している理由は、matplotlib でオブジェクトにラベルを付けるカスタム関数を作成しようとしているからです。以前は、ラベリング関数にネストされたリストの束を渡すだけだと思っていました。

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'

これを行う必要がありますか?おそらくそうではありません。コードを強力に難読化します。自分のコードを見たことが自分だけである場合、それを回避することはできますが、習慣化するのは良い習慣ではありません。使用することを意図したものdictと同じように、 pythonコレクションを活用するだけです。tupleあなたの例では密かに a を使用していますが、オブジェクトをそれぞれのラベル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これらのオブジェクトの 1 つを見た人は、それが何であるかを正確に確認できline2Dますlabels

于 2013-10-15T04:14:45.820 に答える