gpt4 book ai didi

Python:如何返回对象的实例以及使用 setattr 分配的属性

转载 作者:太空宇宙 更新时间:2023-11-03 19:28:53 27 4
gpt4 key购买 nike

我对 python 还很陌生,但是我需要与一些作为一堆 python 模块编写的软件进行交互(.py 文件,以防我错误地将它们识别为“模块”。)这个程序有一些非常有用的功能以及我确实无法破解的复杂功能(如果不出意外的话,因为每次我更新软件,我都必须重新破解所有内容。)

我有一个如下所示的 python 脚本:

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

然后,如果我尝试:

result=mything(4,5)

然后 result 正确包含首先通过 thingfromsoftware 分配给它的所有属性的值,但 result.dimensions 尚未分配(没有属性“尺寸”)

目标是以某种半一致的方式存储 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)

最佳答案

你在做

tube=io.read(str(name))

如果

TYPE!='bare'

所以在这种情况下您将无法获得尺寸。这可能是您遇到问题的原因吗?

另外,你有没有尝试过这样做

tube.dimensions = [tube.get_cell()[0, 0] / 2, tube.get_cell()[-1,-1]]

而不是setattr?仅当要更改的属性名称存储在变量名称中时才需要。

关于Python:如何返回对象的实例以及使用 setattr 分配的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7001676/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com