day15-1


面向对象补充

一、实例代码:

1.class B:
2. def ooo(self):
3. print("B")
4.
5.class C(B):
6. def xxx(self):
7. self.ooo()
8.
9. def ooo(self):
10. print("B")
11.
12.class A:
13. def ooo(self):
14. print("A")
15.
16.class D(A, C):
17. def ddd(self):
18. print("D")
19.
20.obj = D()
21.obj.xxx()

分析:
1、创建一个D类的对象obj;并执行 xxx() 方法
2、然后开始查找方法;首先查找D自身;没有
3、然后查找 C ;C也没有
4、然后查找B ;B里面有;获取并执行 xxx() 方法
5、执行 xxx() 的时候;函数里面又执行了个 self.ooo()
6、此时找到了xxx();而xxx 是 obj 调用的;而obj又是 D 的对象。
7、xxx():被obj 调用;里面的self 自然就指向obj;所以里面的 ooo();方法也是 obj 调用的;obj 又是 D 创建的对象
8、所以相当于在执行 obj.ooo()
9、按照 obj.ooo():这个查找执行

示例图:

Alt text

总结:
1、方法中的 self 谁调用就指向谁

2、创建对象、继承父类;调用父辈类的方法的时候;相当于直接将被调用的函数;直接写在调用对象对应的类里面

3、以后在分析别人源码的时候;一定,一定,一定要分清;方法的发起点;然后从发起点开始按规则往下找。同时;要记住;谁调用self就指向谁

二、执行父类的构造方法

带下划线的方法

派生(子)类会继承基(父)类的方法;同样带下划线的方法也是会被继承的;如:init()

1.class A:
2. def __init__(self):
3. print("A构造方法")
4.
5.class B(A):
6. def __init__(self):
7. print("B构造方法")

分析:
1、类后面加括号();表示自动执行 __init__() 方法
2、__init__()数据的初始化(封装)

执行父类的构造方法

super():执行父类的方法(推荐使用)

语法:

1.super(aa, self).__init__()

表示:执行aa的父类_init_()方法

1.class A:
2. def __init__(self):
3. print("A")
4.
5.class D(A):
6. def __init__(self):
7. print("D")
8. # 这里的self指代 D
9. super(D, self).__init__()
10.
11.obj = D()
另一种直接将父类写在子类中

注意:理解这个父类;从左往右;最左边的是父类;后面的是叔叔辈的

1.class A:
2. def __init__(self):
3. print("A")
4.
5.class D(A):
6. def __init__(self):
7. print("D")
8. # 这里的self指代 D
9. A.__init__(self)
10.
11.obj = D()

当接收2个父类的时候:

1.class B:
2. def __init__(self):
3. print("B")
4.
5.class A:
6. def __init__(self):
7. print("A")
8.
9.class D(A,B):
10. def __init__(self):
11. print("D")
12. # 这里的self指代 D
13. super(D, self).__init__()
14.
15.obj = D()

结果:

1.D
2.A

注意:
当接收多个父类的时候;super 只会执行最左边那个父类的 init():方法


注意:
1、推荐使用super;尽量不要用第二种(直接写的)
2、使用super时;python会按照自己的规则去对应的父类里面寻找;这个规则就是;上面图示的那种规则
3、使用第二种;直接使用父类的类型;随意性大;容易造成代码理解混乱

posted on 2016-10-30 00:25  jayafs  阅读(98)  评论(0)    收藏  举报

导航