python第五天

python中如果子类没有构造方法,就会调用父类构造方法初始化子类对象,但是如果子类有自己的构造方法,那么初始化子类对象的时候只会调用自己的构造方法,不会调用父类构造方法,所以这时父类的属性不能被直接继承(方法可以继承)
在明白了构造方法之后,我们来点进阶的问题,那就是构造方法中的初始值无法继承的问题。

例子:

复制代码
class Bird:

def __init__(self):

      self.hungry = True

def eat(self):

      if self.hungry:

           print 'Ahahahah'

      else:

           print 'No thanks!'

class SongBird(Bird):

 def __init__(self):

      self.sound = 'Squawk'

 def sing(self):

      print self.song()

sb = SongBird()

sb.sing() #能正常输出

sb.eat() #报错,因为songgird中没有hungry特性
复制代码
那解决这个问题的办法有两种:

1、调用未绑定的超类构造方法(多用于旧版python阵营)

复制代码
class SongBird(Bird):

 def __init__(self):

      Bird.__init__(self)

      self.sound = 'Squawk'

 def sing(self):

      print self.song()

复制代码
原理:在调用了一个实例的方法时,该方法的self参数会自动绑定到实例上(称为绑定方法);如果直接调用类的方法(比如Bird.init),那么就没有实例会被绑定,可以自由提供需要的self参数(未绑定方法)。

2、使用super函数(只在新式类中有用)

复制代码
class SongBird(Bird):

 def __init__(self):

      super(SongBird,self).__init__()

      self.sound = 'Squawk'

 def sing(self):

      print self.song()

复制代码
原理:它会查找所有的超类,以及超类的超类,直到找到所需的特性为止。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章