类继承,super()

时间:2013-08-23 05:54:36

标签: python class inheritance python-2.7

我刚刚开始掌握课程,所以我想我会尝试练习制作一个简单的人口动态计划。我不太了解如何实现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()

当我尝试运行它时(使用Eclipse Juno),我得到了这个:

  File "/Users/me/Documents/Coding/Population/Population.py", line 78, in <module>
    b=Babies()
  File "/Users/me/Documents/Coding/Population/Population.py", line 56, in __init__
    super(Babies,self).__init__()
TypeError: __init__() takes exactly 2 arguments (1 given)

2 个答案:

答案 0 :(得分:1)

super用于调用类的基类。

Babies基类是Females,因为Females类构造函数需要两个参数来传递两个参数。

super(Babies, self).__init__('Mary')

这相当于:

Females.__init__(self, 'Mary')

但是super是首选,因为你不需要明确提及超类的名称。

答案 1 :(得分:1)

Babies的超类是女性,它的init需要两个参数:self和female。

super(Babies,self).__init__()仅使用一个参数调用它,隐含self缺少第二个参数。