解读python中SocketServer源码

再看继承

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

  

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

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

  如果这样看,我们是不是就明白了?其实这两段代码表示的是一个意思,尽管Son继承了Base类,父子类中都有同样的方法,但是由于我们实例化了子类的对象,所以这个在初始化方法里的self.Testfunc,self指的是子类的对象,当然也就先调用子类中的方法啦。所以尽管在第一个例子中,初始化方法在父类执行,但是还是改变不了它是子类对象的本质,当我们使用self去调用Testfunc方法时,始终是先调用子类的方法。我们可以这样理解,尽管儿子继承了父亲的财产,但是花钱的时候,还是要先花自己的~~~

 1 #_*_coding:utf-8_*_
 2 __author__ = ‘Eva_J‘
 3 class Base(object):
 4     def __init__(self,name):
 5         self.name = name
 6         self.Testfunc()
 7
 8     def Testfunc(self):
 9         print ‘do Base Testfunc‘
10
11 class Son(Base):
12     def Testfunc(self):
13         print ‘do Son Testfunc‘
14
15 sonobj = Son(‘sonobj‘)

inherit Code

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

       

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

 1 #_*_coding:utf-8_*_
 2 __author__ = ‘Eva_J‘
 3 class Base(object):
 4     def Testfunc(self):
 5         print ‘do Base Testfunc‘
 6
 7 class Son(Base):
 8     def __init__(self,name):
 9         self.name = name
10         self.Testfunc()
11
12     def Testfunc(self):
13         print ‘do Son Testfunc‘
14
15 class Base2(object):
16     def Testfunc(self):
17         print ‘do Base2 Testfunc‘
18
19 class GrandSon(Base2,Son):
20     pass
21
22 #sonobj = Son(‘sonobj‘)
23 sonobj = GrandSon(‘sonobj‘)

inherit2 Code

画个简易类图

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

对照类图看源码

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

  初始化相关过程:

 

  执行serve_forever的相关代码:

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

原文地址:https://www.cnblogs.com/mjc69213/p/9937801.html

时间: 2024-10-08 14:43:29

解读python中SocketServer源码的相关文章

Python之socket_server源码

小知识点: python中无块级作用域,python中是以函数为作用域 python的作用域在执行前就已经确定 SocketServer源码解析: import socketserver class MyClass(socketserver.BaseRequestHandler): def handle(self): pass obj = socketserver.ThreadingTCPServer(("127.0.0.1", 888), MyClass) # socketserve

socketserver 源码剖析:

socketserver 源码剖析[有图有真相]: (一).Socketserver 内部流程调用图:        详解: 1.self.RequestHandlerClass() = MyClass() 转换为 执行这个方法 class MyClass(socketserer.BaseRquestHandler). 2. myclass 没有构造方法 __init__( ),从socketserer.BaseRquestHandler 父类 开始找,有构造函数 __init__( ),并且执

Python:SQLMap源码精读—start函数

源代码 1 def start(): 2 """ 3 This function calls a function that performs checks on both URL 4 stability and all GET, POST, Cookie and User-Agent parameters to 5 check if they are dynamic and SQL injection affected 6 """ 7 if n

Python解析器源码加密系列之(二):一次使用标准c的FILE*访问内存块的尝试

摘要:由于近期打算修改Python解释器以实现pyc文件的加密/解密,出于保密的要求,解密之后的数据只能放在内存中,不能写入到文件中.但是后续的解析pyc文件的代码又只能接受FILE*作为入参,所以就提出了一种把通过FILE*来访问内存的需求,下文是针对这个需求的几个方面的尝试及其结论. 以下尝试的前提是:Win7 + VS2010. 在vc中,FILE其实就是_iobuf,定义如下: struct _iobuf { char *_ptr; //文件输入的下一个位置 int _cnt; //当前

Python:SQLMap源码精读之基于时间的盲注(time-based blind)

基于时间的盲注(time-based blind) 测试应用是否存在SQL注入漏洞时,经常发现某一潜在的漏洞难以确认.这可能源于多种原因,但主要是因为Web应用未显示任何错误,因而无法检索任何数据. 对于这种情况,要想识别漏洞,向数据库注入时间延迟并检查服务器响应是否也已经延迟会很有帮助.时间延迟是一种很强大的技术,Web服务器虽然可以隐藏错误或数据,但必须等待数据库返回结果,因此可用它来确认是否存在SQL注入.该技术尤其适合盲注. 源码解释 代码位置:在checkSqlInjection函数中

python的paramiko源码修改了一下,写了个操作命令的日志审计 bug修改

python的paramiko源码修改了一下,写了个操作命令的日志审计,但是记录的日志中也将backspace删除键记录成^H这个了,于是改了一下代码,用字符串的特性. 字符串具有列表的特性 >>> a="hello world" >>> a[:-1] 'hello worl' 转义符 转义字符 \(在行尾时) 续行符 \\ 反斜杠符号 \' 单引号 \" 双引号 \a 响铃 \b 退格(Backspace) \e 转义 \000 空 \n

Python:SQLMap源码精读之基于错误的盲注(error-based blind)

目标网址 http://127.0.0.1/shentou/sqli-labs-master/Less-5/?id=1 Payload的生成 1 <test> 2 <title>MySQL >= 5.0 AND error-based - WHERE or HAVING clause</title> 3 <stype>2</stype> 4 <level>1</level> 5 <risk>0</r

Python:Sqlmap源码精读之解析xml

XML <?xml version="1.0" encoding="UTF-8"?> <root> <!-- MySQL --> <dbms value="MySQL"> <cast query="CAST(%s AS CHAR)"/> <length query="LENGTH(%s)"/> <isnull query=&quo

【Python】python链表应用源码示例

python链表应用源码示例,需要用到python os模块方法.函数和类的应用. 首先,先简单的来了解下什么是链表?链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. python链表应用源码示例如下: #-*-coding:utf8 -*- import os class Head_List: def __init__(self , id): self.id = id self.next = -1 self.length = 0 def s