在for循环中使用类方法

时间:2019-03-14 15:29:39

标签: python python-3.x

我有一个外部定义的模块,其中包含许多方法。我可以使用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。我该如何实施?

4 个答案:

答案 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))

您可以看看getattr() official documentation

答案 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