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 で実行すると、2 番目のケースでselfに HBatom 親クラスの属性が含まれていないことがわかります。selfが最初のケースではその情報を含むことができるのに、2 番目のケースではできないのはどうしてですか?

申し訳ありませんが、元の投稿に 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

HDonor.find_H() には HBatom 属性が必要なため、Hdon を設定するとコードがトリップします。HDonor インスタンスが HNtwrk から作成されるとき、HDonor 初期化中に HBatom.__init__() が呼び出されないのと同じです。明確にするために、HNtwrk は他のクラスと同じファイルに表示されます。

4

3 に答える 3

0

の代わりに具体的なスーパークラス名、つまり を使用します。HBatomsuper

を呼び出しsuper(HDonor, self)self実際には の子であるHDonor場合、superの結果は関数呼び出しをHDonorクラスに渡しますが、HBatom期待どおりではありません。

問題が発生する理由の詳細については、この回答を参照してください。super

于 2012-04-27T23:05:16.487 に答える
0

HNtwrkorのコードは表示されていませんが、親のメソッドは呼び出されていないbuild_HNtwrkと思います。HNtwrk.__init____init__

于 2012-04-28T03:37:20.957 に答える
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 に答える