Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python继承的古怪性取决于子类的调用方式_Python - Fatal编程技术网

Python继承的古怪性取决于子类的调用方式

Python继承的古怪性取决于子类的调用方式,python,Python,当我从另一个类调用一个子类时,我得到了一个错误,但当我直接调用它时,我没有得到一个错误。似乎当我从另一个类创建这个子类的实例时,超类中的信息并没有传递给子类 class HBatom(object): def __init__(self, struct, sele, **kwargs): self.struct = struct self.sele = sele class HDonor(HBatom): def __init__(self,st

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

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)
但是当我创建一个包含hdonor字典的类的实例,然后告诉它填充时,我得到了一个错误

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.\uuuuu init\uuuuuuuu。需要明确的是,HNtwrk与其他类出现在同一个文件中。

使用具体的超类名称,即HBatom,而不是super

当您调用super、self时,self实际上是HDonor的子类,super的结果将把函数调用传递给HDonor类,而不是您所期望的HBatom


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

您尚未显示HNtwrk或build\u HNtwrk的代码,但我猜HNtwrk。\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。结果证明这根本不是继承问题。 因为我打了电话,所以我遇到了问题

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中包含了这个异常。感谢那些提出建议的人。将来,我将创建一个单独的小代码来隔离问题并发布完整的代码。

您确定代码完全准确吗,例如没有MI?至少,您有一个HBatom/HBatom拼写错误,并且同时缺少一个类start@IgnacioVazquez-艾布拉姆斯:MI是什么?我只知道这是心肌梗死的缩写对不起,这是工作带来的,我希望它在这里意味着其他东西。@Tim:这有时会导致……你也没有显示HNtwrk代码。当然这也很重要?听起来HNtwrk并没有继承HBatom,而是初始化HBonds对象。我同意应该显示出来。我现在已经包括了HNtwrk的相关部分。HNtwrk不调用HBatom _init u,因为它不是HBatom的子类。相反,它意味着包含HBatom的字典并跟踪它们之间的关系。您非常重视使用super,但是更改为HBatom。在这种情况下,**kwargs在init、self、struct、sele中无效