我有一个外部定义的模块,其中包含许多方法。我可以使用dir()作为列表获取所有方法,例如print(dir[Descriptors])
,然后获得列表['BalabanJ', 'BertzCT',...]
。现在,我想将所有方法应用于值[x1,x2,...]的列表。如果我直接使用Descriptors.BalabanJ(x1)
,则可以使用。但是,我想像这样循环进行
from rdkit.Chem import Descriptors
for i in dir[Descriptors]:
for x in [x1,x2,x3]:
print(Descriptors.i(x))
,它表示描述符中没有方法i。我该如何实施?
答案 0 :(得分:4)
我认为您正在寻找getattr
from rdkit.Chem import Descriptors
for i in dir(Descriptors):
if callable(i):
for x in [x1,x2,x3]:
print(getattr(Descriptors ,i)(x))
答案 1 :(得分:2)
我会推荐inspect
:
from rdkit.Chem import Descriptors
import inspect
for i in inspect.getmembers(Descriptors, callable):
for x in [1, 2, 3]:
print(i[0], i[1](x)) # name of function of Descriptors module, result
答案 2 :(得分:1)
您可以使用getattr检索它们
例如
class Bar:
def __init__(self, foo):
self.foo = foo
def p(self):
print(self.foo)
bar = Bar('hello word')
getattr(bar, 'p')()
请注意,如果没有method
i
,则会引发值错误,但是您可以设置默认方法
getattr(bar, 'pr', lambda :print('no such method: pr'))()
如果它是类方法,则需要定义类并将其作为参数传递给bar
from rdkit.Chem import Descriptors
for i in dir[Descriptors]:
for x in [x1,x2,x3]:
print(getattr(Descriptors, i)(x))
答案 3 :(得分:1)
为此,RDKit具有MolecularDescriptorCalculator
。
from rdkit import Chem
from rdkit.ML.Descriptors import MoleculeDescriptors
from rdkit.Chem import Descriptors
descriptors = [d[0] for d in Descriptors._descList]
smiles = ['CCN','CCNC', 'CCN(C)C']
for d in descriptors[:3]: # just the first three descriptors
print(d)
calc = MoleculeDescriptors.MolecularDescriptorCalculator([d])
for s in smiles:
c = calc.CalcDescriptors(Chem.MolFromSmiles(s))
print(s, c[0])
输出:
MaxEStateIndex
CCN 4.847222222222222
CCNC 2.9305555555555554
CCN(C)C 2.125
MinEStateIndex
CCN 0.75
CCNC 1.0694444444444444
CCN(C)C 1.1388888888888888
MaxAbsEStateIndex
CCN 4.847222222222222
CCNC 2.9305555555555554
CCN(C)C 2.125