Python 3.x 无法访问rdkit中Chem.Atom子类中的实例属性
我在rdkit.Chem中定义了Atom的一个子类。我还在其中定义了一个实例属性,但我无法从rdkit中的RWMol对象获取该实例 下面是我的问题的示例代码: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
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;
}