在学习面向对象编程时,遇到了关于类继承和使用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()