文章标题

python中继承的三种方式

这里面包含两种关系:is-a,has-a。

完全继承

这是is-a的关系,就是子类直接继承于父类。

class Parent(object):

    def implicit(self):
        print "PARENT implicit()"

class Child(Parent):
    pass

dad = Parent()
son = Child()

dad.implicit()
son.implicit()

运行的结果:

PARENT implicit()    
PARENT implicit()

son没有implicit方法,由于继承的是parent,parent有,son就可以直接使用。

继承中稍有不同

比如son要有在继承了parent的基础上,有点自己的内容,那怎么办呢?python为我们提供了super()方法

class Parent(object):

    def altered(self):
        print "PARENT altered()"

class Child(Parent):

    def altered(self):
        print "CHILD, BEFORE PARENT altered()"
        super(Child, self).altered()
        print "CHILD, AFTER PARENT altered()"

dad = Parent()
son = Child()

dad.altered()
son.altered()

运行的结果是:

PARENT altered()

CHILD, BEFORE PARENT altered()

PARENT altered()

CHILD, AFTER PARENT altered()

这里son中的altered()的super(Child, self).altered()这个语句就直接调用了parent的altered()方法,但是在son的altered()又有自己的内容:前后两个print。

所以son的altered()方法就打印了三段内容。

使用super()和init相结合的方法实现间接继承

这种方法属于has-a关系,我们首先来看这样一段代码

class Child(Parent):
    def __init__(self, stuff):
        self.stuff = stuff
        super(Child, self).__init__()

在这段代码中,我们定义了一个child类,然后在初始化的过程中,这句代码super(Child, self).__init__()实现了对父类的初始化。

这与之前的child.altered()方法十分类似,唯一不同的是:我们在父类没有使用Parent.__init__初始化之前,就在子类的init初始化方法中,实现了对父类进行初始化。

我们来看一段实际的代码:

class Other(object):

    def override(self):
        print "OTHER override()"

    def implicit(self):
        print "OTHER implicit()"

    def altered(self):
        print "OTHER altered()"

class Child(object):

    def __init__(self):
        self.other = Other()

    def implicit(self):
        self.other.implicit()

    def override(self):
        print "CHILD override()"

    def altered(self):
        print "CHILD, BEFORE OTHER altered()"
        self.other.altered()
        print "CHILD, AFTER OTHER altered()"

son = Child()

son.implicit()
son.override()
son.altered()

运行的结果是:

OTHER implicit()
CHILD override()
CHILD, BEFORE OTHER altered()
OTHER altered()
CHILD, AFTER OTHER altered()

由此可以见,在定义了other这个类之后,我们只要在child的初始化中,加上这样一句:
self.other = Other()
就可以直接调用other类中的方法了。由于other没有自定义的init(),所以在son的init()中也不需要对other类进行初始化了。直接调用即可^_~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值