面向对象中有持续这几个概念

一、前言

Python
面向对象中有承继这么些定义,初学时以为很牛逼,里面也许有个super类,平日来看,方今做一些题才算是精晓了。特意记录分享给新兴切磋的同伙,究竟未来小学生都从头学了(好笑脸)

澳门太阳集团城网址,二、代码

直接上干货,能把下部三个主题材料全答对,前面就毫无看了。

class A():
    def go(self):
        print ("go A go!")
    def stop(self):
        print ("stop A stop!")
    def pause(self):
        raise Exception("Not Implemented")
class B(A):
    def go(self):
        super(B, self).go()
        print ("go B go!")
class C(A):
    def go(self):
        super(C, self).go()
        print ("go C go!")
    def stop(self):
        super(C, self).stop()
        print ("stop C stop!")
class D(B,C):
    def go(self):
        super(D, self).go()
        print ("go D go!")
    def stop(self):
        super(D, self).stop()
        print ("stop D stop!")
    def pause(self):
        print ("wait D wait!")
class E(B,C):
    pass
a = A()
b = B()
c = C()
d = D()
e = E()
# 说明下列代码的输出结果
a.go()
print('--------')
b.go()
print('--------')
c.go()
print('--------')
d.go()
print('--------')
e.go()
print('--------')
a.stop()
print('--------')
b.stop()
print('--------')
c.stop()
print('--------')
d.stop()
print('--------')
e.stop()
print(D.mro())
a.pause()
b.pause()
c.pause()
d.pause()
e.pause()

不容置疑,直接运转就有答案了,依旧要过细想转手,反正看到自己首先次跑出的结果的时候,作者都不敢相信本身的双眼。

 

step1:

多少个概念:

三翻五次的成效:父类的代码重用

多态的意义:同一方法对差异门类的对象会有相应的结果

澳门太陽城集团登录网址,开闭原则:对扩展开放,对修改密封

super类成效:新式类落成广度优先的不另行的调用父类,化解了金刚石承袭(多再而三)的难题

 

step2:

super完结原理:通过c3算法,生成mro(method resolution
order)列表,遵照列表中元素顺序查询调用

风行类调用顺序为广度优先,旧式类为深度优先

面向对象中有持续这几个概念。面向对象中有持续这几个概念。 

面向对象中有持续这几个概念。step3:

民用通晓:

1.调用了父类的不二等秘书籍,出入的是子类的实例对象

2.新式类子类(A,B),A就在B此前

3.super类似于嵌套的一种设计,当代码施行到super实例化后,先去找同级父类,若未有其余父类,再奉行本身父类,再往下走,

  简洁点的三个规范便是:

子类在父类前,全数类不另行调用,从左到右

 

明亮了以上的布道,标题就没难题了。

也不用跑了,答案如下:

 

a.go()# go A go!
b.go()# go A go!# go B go!
c.go()# go A go!# go C go!
d.go()# go A go!# go C go!# go B go!# go D go!
e.go()# go A go!# go C go!# go B go!
a.stop()# stop A stop!
b.stop()# stop A stop!
c.stop()# stop A stop!# stop C stop!
d.stop()# stop A stop!# stop C stop!# stop D stop!
e.stop()# stop A stop!
a.pause()# ... Exception: Not Implemented
b.pause()# ... Exception: Not Implemented
c.pause()# ... Exception: Not Implemented
d.pause()# wait D wait!
e.pause()# ...Exception: Not Implemented

看了答案,其实还应该有少数,父类抛相当的处境,假设子类有不抛至极的方法,十分就不抛出了,那个设计也会很有用。

面向对象中有持续这几个概念。此处就中等一个A,C,B,D的和网络海人民广播广播台大的不太同样,促使自个儿稳重研讨了眨眼间间,其实正是个人掌握第三条。

 

面向对象中有持续这几个概念。 

 

补充:

Python2 和Python3在那一个题目上的不相同

 

Python2 没有暗中认可承继object

Python3 暗中同意全体承接object类,都以前卫类

 

Python2super调用 super(开始类名,self).函数名()

Python3  super().函数名()

 

有关调用父类函数字传送入子类实例的尖栗举贰个:

class A:
    def __init__(self):
        self.n = 2

    def add(self, m):
        print('self is {0} @A.add'.format(self))
        self.n += m


class B(A):
    def __init__(self):
        self.n = 3

    def add(self, m):
        print('self is {0} @B.add'.format(self))
        super().add(m)
        print('newb')
        self.n += 3


class C(A):
    def __init__(self):
        self.n = 4

    def add(self, m):
        print('self is {0} @C.add'.format(self))
        super().add(m)
        print('newc')
        self.n += 4


class D(B, C):
    def __init__(self):
        self.n = 5

    def add(self, m):
        print('self is {0} @D.add'.format(self))
        super().add(m)
        self.n += 5


d = D()
d.add(2)
print(d.n)

 

 

 

夜深了,临时会如此多就写这么多,有空商讨c3规律(挖个坑先)

 

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图