2013-10-15 6 views
1

사전과 같은 컨테이너를 파이썬의 기존 객체에 추가하는 것이 어떻습니까? 난 그냥하기 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이 없었다. Line2D 개체에 일부 데이터를 저장하기 때문에 방금 .labels을 만들었습니다. 이것은 좋은 접근 방법입니까? 그렇지 않다면, 당신은 또 무엇을 제안합니까?

문제가되는 경우, 내가 이것을 조사하는 이유는 matplotlib의 Line2D 개체에 레이블을 지정하는 사용자 지정 함수를 만드는 중입니다. 이전에는 라벨링 기능에 중첩 된 목록을 넘겨 주겠다고 생각했습니다.

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과 같은 파이썬 콜렉션을 사용하는 것처럼 사용하십시오. 귀하의 예에서 은밀하게 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

관련 문제