对super函数的简单理解

在看Magnus Lie Hetland的《Python基础教程》,虽然进度很慢但终究还是有些收获。在第9章讲构造方法的时候,介绍到super函数能够使子类调用超类的构造方法,以获得其基本的初始化。
举个例子:

class Bird:
    def __init__(self):
        self.hungry = True
    def eat(self):
        if self.hungry:
            print 'Aaaah...'
            self.hungry = False
        else:
            print 'No, thanks!'
class SongBird(Bird):
    def __init__(self):
        self.sound = 'Squawk!'
    def sing(self):
        print self.sound

定义了一个类Bird,初始化的饥饿参数是True。再定义其子类SongBird,它多了一个功能是唱歌,初始化其声音参数是’Squawk!’。虽然SongBird继承了Bird的eat方法,但是没有hungry的特性,这是因为SongBird的构造方法被重写了,没有初始化饥饿参数。

使用super函数可以很好的解决这个问题,但前提是要使用新式类。运行如下代码,可以得到正确结果。

__metaclass__ = type
# Bird should succed from object
class Bird:
    def __init__(self):
        self.hungry = True
    def eat(self):
        if self.hungry:
            print 'Aaaah...'
            self.hungry = False
        else:
            print 'No, thanks!'
class SongBird(Bird):
    def __init__(self):
        super(SongBird, self).__init__()
        self.sound = 'Squawk!'
    def sing(self):
        print self.sound

sb = SongBird()
sb.sing()
sb.eat()
sb.eat()

运行结果:

Squawk!
Aaaah…
No, thanks!

SongBird既能唱歌又能吃东西,能够完成超类的初始化构造方法。
在使用新式类的时候也可以不加第一行代码,__metaclass__ = type,而直接让Bird继承object类,既类的定义为class Bird(object):
在运行这段代码的时候也出现了一个小的插曲,本想写这篇博客来说书上给的代码运行有问题,继承object才行。一写代码发现,原来__metaclass__ = type的下划线是两道,我在编辑器中两道连在一起没有看出来也是醉了。
super函数还是很有用的哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值