Class Inheritance and super()

135 阅读2分钟

在学习面向对象编程时,遇到了关于类继承和使用super()函数的问题。 构造一个简单的种群动态程序的代码示例,但是调试时发现super()函数的使用出现了问题。

代码示例:

class Females(object):
    '''Female population settings. Defines the pregnancy rates, death rates,
     and live births for a year.'''

    def __init__(self,female):
        super(Females,self).__init__()
        self.female = female
        self.live_birth

    def __str__(self):
        return 'Current female population: {0}'.format(str(self.female))

    def death(self):
        self.female_death_oldage=int((randint(0,50)*0.01)*female)
        return self.female_death_oldage

    def pregnancies(self):
        self.female_pregnancies=int(((randint(0,100)*0.01)*female)*0.2)
        return self.female_pregnancies

    def live_birth(self):
        self.live_births=int(self.female_pregnancies*((randint(0,100)*0.01)))             
        return self.live_births

    def total_females(self):
        self.next_female_generation = female - self.female_death_oldage


class Babies(Females):

    def __init__(self):
        super(Babies,self).__init__()

    def babies_born(self):
        self.little_girls = int(self.live_births*(randint(0,100)*0.01))
        self.little_boys = (self.live_births - self.little_girls)    
        return self.little_boys,self.little_girls

if __name__=='__main__':
    x=Males(male)
    y=Females(female)
    b=Babies()
    print '%r males died from old age' % x.death()
    print '%r females became pregnant' % y.pregnancies()    
    print 'There were %r live births'  % y.live_births()
    print b.babies_born()

当运行这段代码时,遇到了以下错误:

TypeError: __init__() takes exactly 2 arguments (1 given)

2、解决方案

super()函数用于调用父类的构造函数。在 Babies 类中,父类是 Females。Females 类的构造函数需要两个参数:self 和 female。在示例代码中,super(Babies, self).init() 只传递了一个参数,导致了错误。

要解决此问题,需要在 super 的调用中传递 female 参数:

class Babies(Females):

    def __init__(self, female):
        super(Babies,self).__init__(female)

这个改动使 Babies 的构造函数与 Females 的构造函数具有相同的签名,解决了错误。

这段包含修复的代码如下:

class Females(object):
    '''Female population settings. Defines the pregnancy rates, death rates,
     and live births for a year.'''

    def __init__(self,female):
        super(Females,self).__init__()
        self.female = female
        self.live_birth

    def __str__(self):
        return 'Current female population: {0}'.format(str(self.female))

    def death(self):
        self.female_death_oldage=int((randint(0,50)*0.01)*female)
        return self.female_death_oldage

    def pregnancies(self):
        self.female_pregnancies=int(((randint(0,100)*0.01)*female)*0.2)
        return self.female_pregnancies

    def live_birth(self):
        self.live_births=int(self.female_pregnancies*((randint(0,100)*0.01)))             
        return self.live_births

    def total_females(self):
        self.next_female_generation = female - self.female_death_oldage


class Babies(Females):

    def __init__(self, female):
        super(Babies,self).__init__(female)

    def babies_born(self):
        self.little_girls = int(self.live_births*(randint(0,100)*0.01))
        self.little_boys = (self.live_births - self.little_girls)    
        return self.little_boys,self.little_girls

if __name__=='__main__':
    x=Males(male)
    y=Females(female)
    b=Babies(female)
    print '%r males died from old age' % x.death()
    print '%r females became pregnant' % y.pregnancies()    
    print 'There were %r live births'  % y.live_births()
    print b.babies_born()