python SocketServer源码深入解读


Posted in Python onSeptember 17, 2019

再看继承

真正的大餐来之前,还是来点儿开胃菜!回顾一下关于类的继承的知识:

python SocketServer源码深入解读

python SocketServer源码深入解读

python SocketServer源码深入解读

我们先看上面的代码,这是一个简单的类继承,我们可以看到父类Base和子类Son,它们中各有一个Testfunc方法,当我们实例化子类的对象sonobj时,可以看到初始化方法中黄色框框调用了Testfunc,那么这个时候执行的是哪个类里面的代码呢?我会告诉你执行的是子类里面的方法,不信就自己试试吧,代码在下面~

为什么呢?其实这里是绕了一个圈,所以把很多人绕晕了,包括我!后来想想其实很容易,我们看最右边的图:

如果这样看,我们是不是就明白了?其实这两段代码表示的是一个意思,尽管Son继承了Base类,父子类中都有同样的方法,但是由于我们实例化了子类的对象,所以这个在初始化方法里的self.Testfunc,self指的是子类的对象,当然也就先调用子类中的方法啦。

所以尽管在第一个例子中,初始化方法在父类执行,但是还是改变不了它是子类对象的本质,当我们使用self去调用Testfunc方法时,始终是先调用子类的方法。我们可以这样理解,尽管儿子继承了父亲的财产,但是花钱的时候,还是要先花自己的~~~

#_*_coding:utf-8_*_
__author__ = 'Eva_J'
class Base(object):
  def __init__(self,name):
    self.name = name
    self.Testfunc()
  def Testfunc(self):
    print 'do Base Testfunc'
class Son(Base):
  def Testfunc(self):
    print 'do Son Testfunc'
sonobj = Son('sonobj')
inherit Code

看完刚刚的代码,我们就知道了对象和self的真实意义,现在再来回忆一下关于继承的顺序问题:

python SocketServer源码深入解读

看上面的代码,我们猜测一下,执行之后,控制台会打印什么呢?先揭晓答案,会打印Base2方法中的内容,原因很简单:尽管这三个类中都有同样的Testfunc方法,但是,由于计算机在找方法的时候,遵循的顺序是:Base2,Son,Base,所以它会先找到Base2类,而这个类中刚好有它要找的方法,它也就欢欢喜喜的拿去执行啦!

#_*_coding:utf-8_*_
__author__ = 'Eva_J'
class Base(object):
  def Testfunc(self):
    print 'do Base Testfunc'
class Son(Base):
  def __init__(self,name):
    self.name = name
    self.Testfunc()
  def Testfunc(self):
    print 'do Son Testfunc'
class Base2(object):
  def Testfunc(self):
    print 'do Base2 Testfunc'
class GrandSon(Base2,Son):
  pass
#sonobj = Son('sonobj')
sonobj = GrandSon('sonobj')
inherit2 Code

画个简易类图

刚刚我们只是写了一个小程序,来说明类之间的继承和对象调用方法之间的联系,但是如果我们想要hold住一个继承关系复杂的源码逻辑,就需要类图来帮忙!如果你觉得我要教你画类图那就大错特错了。。。懒人症重症患者是懒得画那种东西的。。。嘻,先看图!

python SocketServer源码深入解读

对照类图看源码

根据上面的图,我们就拿到了threadingTCPServer的相关类,并且搞清楚了它们之间的继承关系和方法,接下来我们对照这张简易类图来看看代码执行的过程:

初始化相关过程:

python SocketServer源码深入解读

执行serve_forever的相关代码:

python SocketServer源码深入解读

就是这样,我们一路按照调用轨迹去寻找,每次看到一个调用都先对照上面的简易类图,看看有没有重名方法,如果有,就要找到最近的方法并查看里面的内容,以此类推:按照这种方法,就会感觉所有代码都在一个文件一样,妈妈再也不用担心我看不懂源码,哈!!!当然啦,这种方法比较山寨,自己心里知道就好,不要告诉别人你其实是这样看懂源码的~~~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中特殊函数集锦
Jul 27 Python
python实现发送和获取手机短信验证码
Jan 15 Python
浅谈python 四种数值类型(int,long,float,complex)
Jun 08 Python
python实现闹钟定时播放音乐功能
Jan 25 Python
Python实现针对给定单链表删除指定节点的方法
Apr 12 Python
python爬虫添加请求头代码实例
Dec 28 Python
Python-jenkins 获取job构建信息方式
May 12 Python
浅谈pytorch中的BN层的注意事项
Jun 23 Python
Python制作一个仿QQ办公版的图形登录界面
Sep 22 Python
Python实现定时监测网站运行状态的示例代码
Sep 30 Python
Python的collections模块真的很好用
Mar 01 Python
Django drf请求模块源码解析
Jun 08 Python
Python @property使用方法解析
Sep 17 #Python
Python爬取知乎图片代码实现解析
Sep 17 #Python
Python读写文件模式和文件对象方法实例详解
Sep 17 #Python
Python爬取破解无线网络wifi密码过程解析
Sep 17 #Python
Python使用random模块生成随机数操作实例详解
Sep 17 #Python
python同时替换多个字符串方法示例
Sep 17 #Python
python 函数的缺省参数使用注意事项分析
Sep 17 #Python
You might like
PHP面向对象法则
2012/02/23 PHP
PHP实现冒泡排序的简单实例
2016/05/26 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
2019/10/15 PHP
jQuery ui 1.7更新小结
2009/08/15 Javascript
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
2014/06/06 Javascript
jQuery解析json数据实例分析
2015/11/24 Javascript
在ASP.NET MVC项目中使用RequireJS库的用法示例
2016/02/15 Javascript
jQuery实现公告新闻自动滚屏效果实例代码
2016/07/14 Javascript
jQuery中的100个技巧汇总
2016/12/15 Javascript
教你快速搭建Node.Js服务器的方法教程
2017/03/30 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
2017/09/02 Javascript
Vue组件创建和传值的方法
2018/08/17 Javascript
Vue.js点击切换按钮改变内容的实例讲解
2018/08/22 Javascript
基于vue.js实现分页查询功能
2018/12/29 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
JavaScript常用工具函数库汇总
2020/09/17 Javascript
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
2015/04/25 Python
python交互式图形编程实例(二)
2017/11/17 Python
python自动化生成IOS的图标
2018/11/13 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
详解python 破解网站反爬虫的两种简单方法
2020/02/09 Python
Anaconda配置pytorch-gpu虚拟环境的图文教程
2020/04/16 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
Django实现内容缓存实例方法
2020/06/30 Python
python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码
2021/01/06 Python
HTML5拖拽文件上传的示例代码
2021/03/04 HTML / CSS
曼城官方网上商店:Manchester City
2019/09/10 全球购物
医学专业个人求职自荐信格式
2013/09/23 职场文书
经典优秀个人求职自荐信格式
2013/09/25 职场文书
哈理工毕业生的求职信
2013/12/22 职场文书
《音乐之都维也纳》教学反思
2014/04/16 职场文书
危货运输企业安全生产责任书
2014/07/28 职场文书
JavaScript嵌入百度地图API的最详细方法
2021/04/16 Javascript