2011-08-09 4 views
2

저는 아직 Python에 익숙하지 않지만 파이썬 모듈 (.py 파일의 경우에는 많은 경우)로 작성된 일부 소프트웨어와 인터페이스해야합니다. 나는이 프로그램을 "모듈"이라고 잘못 인식했다.)이 프로그램은 매우 유용하고 복잡한 기능을 가지고 있으며 실제로 해킹 할 수 없다. (소프트웨어를 업데이트 할 때마다 모든 것을 다시 해킹해야하기 때문이다.)Python : setattr에 할당 된 속성과 함께 객체의 인스턴스를 반환하는 방법

내가하려고하면 다음

from software import thingfromsoftware 
def mything(x,y,someboolean=True,etc) 
    var=thingfromsoftware(x,y) 
    #....code.... 
    setattr(var, 'dimensions', somearraything) 
    return(var) 

을 :

나는 다음과 같습니다 파이썬 스크립트가

,691,363,210
result=mything(4,5) 

다음 result 올바르게 제 thingfromsoftware 통해 할당 된 모든 속성의 값을 포함하지만 result.dimensions 할당되지 않은 (has no attribute "dimensions")

목적은 모든 resultdimensions 계산하고 myfunctionthing로 구성된 저장하는 일부 반 응집 방식으로 (요청시)

실제 코드

from ase.structure import nanotube 
from ase import Atoms, view, io 
from numpy import * 
from Avogadro import Molecule, MoleculeFile 
import cPickle as pickle 
import os 


def make_nanotube(n,m,length=1,TYPE='free'): 
    #This will set up leads so transport occures along the z axis and leads are aligned along the y axis (so they may be separated along the x axis.) 

    os.chdir("/tmp") 

    print 'Making ('+str(n)+','+str(m)+') nanotube with '+str(length)+" unit cell as "+str(TYPE) 
    tube = nanotube(n, m, length=length, bond=1.420, symbol='C') 
    center=tube.get_center_of_mass() 
    name='tube:('+str(n)+', '+str(m)+'):unit cells:'+str(length)+':'+str(TYPE)+'.xyz' 
    io.write(str(name), tube) 

    print 'Computing bonds' 
    mol = MoleculeFile.readMolecule(str(name)) 

    RELOAD=0 
    for atom in mol.atoms[:]: 
     if len(atom.bonds)<2 and atom.pos[-1]<center[-1]: 
      print 'Relocating atom '+str(atom.index)+' from '+str(atom.pos[-1])+' to '+str(tube.get_cell()[-1, -1] + atom.pos[-1]) 
      tube.positions[atom.index, -1] += tube.get_cell()[-1, -1] 
      RELOAD=1 

    print 'Orienting tube' 
    tip_atom=tube.get_positions()[:, -1].argmax() #the tip on the right (farther) end 
    tip=tube.get_positions()[tip_atom] 
    tube.rotate(append(tip[:-1], 0), append(center[0], zeros(2)), center=center) #rotate so that the tip is slanted toward x-axis (center[0],0,0) 
    tube.center() 
    setattr(tube, 'dimensions', [tube.get_cell()[0, 0]/2,tube.get_cell()[-1,-1]]) 
    cell=tube.get_cell() 

    if TYPE!='bare': 
     if RELOAD==1: 
      print 'Recomputing bonds' 
      io.write(str(name), tube) 
      mol = MoleculeFile.readMolecule(str(name)) 

     print 'Adding hydrogens' 
     mol.addHydrogens() 

     if TYPE=='left lead': 
      print 'Removing hydrogens from the right side' 
      for atom in mol.atoms[:]: 
       if atom.pos[2]<center[2]: 
        mol.removeHydrogens(atom) 
     elif TYPE=='right lead': 
      print 'Removing hydrogens from the left side' 
      for atom in mol.atoms[:]: 
       if atom.pos[2]>center[2]: 
        mol.removeHydrogens(atom) 
     MoleculeFile.writeMolecule(mol,str(name)) 
     tube=io.read(str(name)) 
    else: 
     tube.set_cell(cell) 
    return(tube) 
+0

게시 한 코드에 문제가없는 것 같습니다. 실제 코드를 보여줘야합니다. – agf

+0

좋아, 방금 했어. 그것은 오히려 길다. 그래서 처음에 게시하지 않았습니다. –

+0

@agf 이것을 파이썬 대화 형 세션에서 실행합니다 : execfile ('/ home/labgroup/Documents/scripts/make_nanotube.py'); test = make_nanotube (4,4); test.dimensions; –

답변

1

TYPE!='bare' 

그래서이 경우 당신은 크기를 얻을 수 없겠죠

tube=io.read(str(name)) 

경우가하고있는. 이것이 왜 당신이 문제를 겪고있는 이유 일 수 있습니까? 또한

, 당신은 단지
tube.dimensions = [tube.get_cell()[0, 0]/2, tube.get_cell()[-1,-1]] 

대신 setattr

을하고 봤어? 변경할 속성의 이름이 변수 이름에 저장 될 때만 필요합니다.

+0

그건 의미가 있습니다. 확실히 테스트 해 봅시다. 이 경우 고맙습니다. 글로벌 한 디버깅 질문 대신 게시하는 것에 대해 사과드립니다. 이 게시물이 작동하면이 게시물을 삭제합니다 (유용하다고 생각하는 유일한 사람). –

+0

아니요, 삭제하지 마세요. 이와 같은 질문은 항상 게시되며 추후에 누가 코드에 도움이 될지 알 수 없습니다. 그것은 편집 이후 downvote 자격이되지 않습니다; 하루가 끝나고 투표를 마치 자마자 나는 그것을 upvote거야. – agf

+0

확인. 감사. 어쨌든 제거 할 수 없습니다 (삭제 기능이없는 것 같습니다). –

관련 문제