第十六篇面向对象进阶二
问题一
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()
下面是查找源码实例图