2011-08-09 4 views
2

私はまだPythonの新機能ですが、Pythonモジュールの束として書かれているいくつかのソフトウェアとインターフェースする必要があります私は間違いなくそれらを「モジュール」と認識していました)。このプログラムには非常に便利で複雑な機能がいくつかあります(ソフトウェアをアップデートするたびに、すべてを再ハックする必要があるため、実際にはハッキングできません)。Python:setattrで割り当てられた属性とともにオブジェクトのインスタンスを返す方法

私がしようとした場合、その後

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

を::

私はこのようになりますPythonスクリプトを持っている

result=mything(4,5) 

そしてresultが正しく(has no attribute "dimensions")最初thingfromsoftwareしかしresult.dimensionsを経由して、それに割り当てられたすべての属性の値が割り当てられていない含まれてい

目標は、myfunctionthingによって計算され、設定されたすべてのresultdimensionsを格納することですいくつかの半コヒーレントなやり方で。

(要望に応じて)実際のコード

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これをPythonのインタラクティブなセッションで実行します: 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

いいえ、削除しないでください。このような質問は常にポストされていますが、将来あなたのコードによって誰が助けられるのかは決して分かりません。編集してからダウンボォートに値するわけではありません。私が終わりに投票を取りやめるとすぐに私はそれをアップヴォートするでしょう。 – agf

+0

ありがとう。とにかく削除できませんでした(削除機能がないようです)。 –

関連する問題