第十六篇面向对象进阶二

问题一

1、下面的结果是什么?

class A:
    def bar(self):
        print("bar")
        self.f1()
class B(A):
    def f1(self):
        print("F1")
class C:
    def f1(self):
        print("C")
class D(C,B):
    pass
d1 = D()
d1.bar()

 要想弄清楚A中的self指代的是谁?

下面执行流程

由于D继承C和B,这里执行bar方法所以就去C和B中寻找,但是没有,之后去A中寻找,这时候的self指代的就是D的对象d1,

就相当于执行d1.f1(),

执行d1.f1(),当然要从基类的C中寻找,所以结果为C

二、super方法执行基类的构造方法

 

由于子类继承父类的时候,写构造方法的时候需要将父类的构造方法重新写一下,但是用了super方法就可以大大简化代码

 

执行父类的构造方法有下面两种:

super(当前类名,self).init()

父类.__init__(self.xxx)

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 class Animal:
 4     def __init__(self):
 5         print("A的构造方法")
 6         self.py = "动物"
 7 class cat(Animal):
 8     def __init__(self):
 9         print ("B的构造方法")
10         self.n = ""
11         #继承父类的构造方法,下面的self指代的是cat这个对象
12         super(cat,self).__init__()
13         #Animal.__init__(self)  这个不推荐
14 c = cat()

三、查找源码的过程(要从底层开始找)

import socketserver

r = socketserver.ThreadingTCPServer()

r.server_forver()

下面是查找源码实例图

posted @ 2017-02-19 01:49  pyrene  阅读(137)  评论(0编辑  收藏  举报