1

当我从另一个类调用子类时出现错误,但当我直接调用它时却没有。似乎当我从不同的类创建这个子类的实例时,超类中的信息没有传递给子类。

class HBatom(object):
    def __init__(self, struct, sele, **kwargs):
        self.struct = struct
        self.sele = sele

class HDonor(HBatom):
    def __init__(self,struct,sele,**kwargs):
        super(HDonor,self).__init__(struct,sele,**kwargs)
        self.find_H()
    def find_H(self):
        bonded = self.struct.select(''.join(["bonded to ", self.sele.getSelstr()]))

这有效

import HBonds
HB = HBonds.HDonor(structure,Nsel,f_wat=1)

但是,当我创建一个包含 HDonors 字典的类的实例,然后告诉它填充时,我得到一个错误

HN = HBonds.HNtwrk(structure,1)
HN.build_HNtwrk()

AttributeError: 'HDonor' object has no attribute 'sele'

用 pdb 执行告诉我,在第二种情况下self不包含 HBatom 父类的属性。self如何在第一种情况下包含该信息但在第二种情况下不包含该信息?

抱歉,我没有在原始帖子中包含 HNtwrk。总代码将近 400 行,所以我不想包含不必要的内容。这是HNtwrk的相关部分

class HNtwrk:
  def __init__(self,structure, f_wat = 0):
    self.f_wat = f_wat
    self.struct = structure
    self.rh_o = 2.5
    self.rn_o = 3.5
    self.Dons = dict()
    self.Accs = dict()

def build_HNtwrk(self):
    Dsele = self.struct.select(DonStr)
    Asele = self.struct.select(AccStr)
    self.addDons(Dsele)
    self.addAccs(Asele)

def addDons(self, Dsele):
    for pairs in iterNeighbors(Dsele,self.rn_o,Asele):
        iN = pairs[0].getIndices()[0]
        iA = pairs[1].getIndices()[0]

        if iN not in self.Dons:
            Hdon = HDonor(self.struct,pairs[0].getSelstr,f_wat=self.f_wat)
            self.Dons[iN] = Hdon

当我设置 Hdon 时代码会跳闸,因为 HDonor.find_H() 需要 HBatom 属性。当从 HNtwrk 创建 HDonor 实例时,就好像在 HDonor 初始化期间未调用 HBatom.__init__()。为了清楚起见,HNtwrk 与其他类出现在同一个文件中。

4

3 回答 3

0

使用具体的超类名称,即HBatom代替super.

当您调用super(HDonor, self), 并且self实际上是 , 的子级时HDonorsuper结果会将函数调用传递给HDonor类,而不是HBatom您预期的。

有关为什么会产生问题的更多详细信息,请参阅此答案。super

于 2012-04-27T23:05:16.487 回答
0

问题解决了。事实证明,这根本不是继承问题。我遇到了问题,因为我打电话

Hdon = HDonor(self.struct,pairs[0].getSelstr,f_wat=self.f_wat)

而不是应该用

Hdon = HDonor(self.struct,pairs[0].getSelstr(),f_wat=self.f_wat)

因此,我没有通过我认为我通过的内容,这引发了我包含在 HBatom.__init__() 中的一个写得很糟糕的异常(我未能将其作为代码片段包含在内)。感谢那些提供建议的人。将来我将创建一个单独的小代码来隔离问题并发布完整的代码。

于 2012-04-30T18:32:07.077 回答
0

您没有显示HNtwrkor的代码build_HNtwrk,但我猜这HNtwrk.__init__不会调用父__init__方法。

于 2012-04-28T03:37:20.957 回答