Python之路--super关键字

python之路–super关键字

最近遇到了python类的继承,要想让代码贯彻pythonic的简洁风范,super或许是你的一个不错的选择,官方文档里对super的介绍在这儿 [Built-in Functions — Python 2.7.12 documentation][1]

普通继承

python的继承实现起来非常简单:

class A:
    pass
class B(A):
    pass

如果父类定义了__init__方法,那么子类必须显示的调用父类的__init__方法:

class A:
    def __init__(self):
        print "I'm A"

class B(A):
    def __init__(self):
        A.__init__(self):

>>>test = B()
I’m A

super继承

class A(object):
    def __init__(self):
        print "I'm A"

class B(A):
    def __init__(self):
        super(B, self).__init__(self)

>>>test = B()
I’m A

注意这里的几点不同:

  • 1,父类A必须继承于object,即父类A必须为新式类
  • 2,继承模式为
    class ClassName(B):
        def method(self, arg):
            super(ClassName, self).method(arg)

为什么要用super?

在上面的例子中,super并没有体现什么优越性,甚至还增加了对父类的限制。但在下面的样例中,super的个性就凸显出来了。

多类继承

普通继承
class A(object):
    def __init__(self):
        print "Enter A"
        print "Leave A"

class B(A):
    def __init__(self):
        print "Enter B"
        A.__init__(self)
        print "Leave B"

class C(A):
    def __init__(self):
        print "Enter C"
        A.__init__(self)
        print "Leave C"

class D(B, C):
    def __init__(self):
        print "Enter D"
        B.__init__(self)
        C.__init__(self)
        print "Leave D"

>>>test = D()
Enter D
Enter B
Enter A
Leave A
Leave B
Enter C
Enter A
Leave A
Leave C
Leave D

super继承
class A(object):
    def __init__(self):
        print "Enter A"
        print "Leave A"

class B(A):
    def __init__(self):
        print "Enter B"
        super(B, self).__init__()
        print "Leave B"

class C(A):
    def __init__(self):
        print "Enter C"
        super(C, self).__init__()
        print "Leave C"

class D(B, C):
    def __init__(self):
        print "Enter D"
        super(D, self).__init__()
        print "Leave D"

>>>test = D()
Enter D
Enter B
Enter C
Enter A
Leave A
Leave C
Leave B
Leave D

对比以上两种方式及其结果,我们发现:
- super在针对多类继承时语法更为简洁,不管是几类继承,只需要一个super(ClassName, self).method(arg)就可以了,这一点优势将在你的继承父类可能变化,而你的代码量又比较庞大时迅速凸显出来,试想别的程序员在小心翼翼的寻找代码改动时,你只需要改动一行(甚至不需要改,在后面会谈到),这是一件多么美妙的事。
- 我们还看到在普通多重继承时,公共父类A被执行了两次,而在super继承时,公共父类A只被执行了一次,这是由于python的MRO(Method Resolution Order)机制造成的,对MRO机制的详细介绍我们会在以后给出。

==========================================
未完待续

参考资料:
https://docs.python.org/2/library/functions.html?highlight=super#super
https://www.python.org/download/releases/2.3/mro/

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值