Python 3.x 无法访问rdkit中Chem.Atom子类中的实例属性

Python 3.x 无法访问rdkit中Chem.Atom子类中的实例属性,python-3.x,inheritance,rdkit,Python 3.x,Inheritance,Rdkit,我在rdkit.Chem中定义了Atom的一个子类。我还在其中定义了一个实例属性,但我无法从rdkit中的RWMol对象获取该实例 下面是我的问题的示例代码: from rdkit import Chem class MyAtom(Chem.Atom): def __init__(self, symbol, **kwargs): super().__init__(symbol, **kwargs) self.my_attribute = 0

我在rdkit.Chem中定义了Atom的一个子类。我还在其中定义了一个实例属性,但我无法从rdkit中的RWMol对象获取该实例

下面是我的问题的示例代码:

from rdkit import Chem

class MyAtom(Chem.Atom):

    def __init__(self, symbol, **kwargs):
        super().__init__(symbol, **kwargs)
        self.my_attribute = 0

    def get_my_attribute(self):
        return self.my_attribute

if __name__ == '__main__':
    rw_mol = Chem.RWMol()

    # I created MyAtom class object then added to RWMol. But I couldn't get it again.
    my_atom = MyAtom('C')
    my_atom.my_attribute = 3

    rw_mol.AddAtom(my_atom)
    atom_in_mol = rw_mol.GetAtoms()[0]

    # I can access my_atom new defined attributes.
    print(my_atom.get_my_attribute())

    # below two line gives error: AttributeError: 'Atom' object has no attribute 'get_my_attribute'
    print(atom_in_mol.get_my_attribute())
    print(atom_in_mol.my_attribute)

    # type(atom1): <class '__main__.MyAtom'>
    # type(atom_in_mol): <class 'rdkit.Chem.rdchem.Atom'>
    # Why below atom types are different? Thanks to polymorphism, that two object types must be same.
通常,此代码必须运行,但由于最后一行的原因,它会给出错误,因为对象类型中的atom是Chem.atom。但它应该是MyAtom吗?我也无法直接访问我的_属性

RDKIT Python库是C++的包装器。那么问题就在这里?我不能对此库使用继承吗


注意:我研究了rdkit文档,有一种SetProp方法可以将值保存在atoms中。它使用字典来保存值。它运行正常,但对我的项目来说太慢了。我想使用实例属性来保存额外的值。对于继承问题有没有解决方案,或者更快的不同解决方案?

< Python RDKIT库是C++包装器,所以有时它不遵循传统的Python对象处理。 要深入了解,您必须仔细阅读源代码:

rw_mol.AddAtom(my_atom)
上面将在中执行AddAtom方法,该方法依次在中调用AddAtom方法,然后在中调用AddAtom方法,默认参数为updateLabel=true和takeOwnership=false

takeOwnership=false条件使参数atom被复制

// rdkit/Code/GraphMol/ROMol.cpp
if (!takeOwnership)
  atom_p = atom_pin->copy();
else
  atom_p = atom_pin;
最后,如果您研究复制方法在


所以,它重新实例化Atom类并返回它。

我理解。为什么开发人员不将takeownership参数添加到python代码中?我不确定,您可以轻松地添加一个新方法并重新编译RDKit,看看这是否可以保存您的对象。我检查了该方法,但我认为它不起作用。因为如果它起作用,开发人员已经在python代码中添加了takeownership。
Atom *Atom::copy() const {
  auto *res = new Atom(*this);
  return res;
}