zoukankan      html  css  js  c++  java
  • 解读python中SocketServer源码

    在看SocketServer源码之前,先看一个例子:

    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')
    View Code

    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')
    
    sonobj = Son('sonobj')
    View Code

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

    其实这两段代码表示的是一个意思,尽管Son继承了Base类,父子类中都有同样的方法,但是由于我们实例化了子类的对象,所以这个在初始化方法里的self.Testfunc,self指的是子类的对象,当然也就先调用子类中的方法啦。所以尽管在第一个例子中,初始化方法在父类执行,但是还是改变不了它是子类对象的本质,当我们使用self去调用Testfunc方法时,始终是先调用子类的方法。

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

    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')
    View Code

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

    为了更好的来说明类之间的继承和对象调用方法之间的联系,我们需要画个简易的类图:

    对照类图看源码

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

      初始化相关过程:

       执行serve_forever的相关代码:

    就是这样,我们一路按照调用轨迹去寻找,每次看到一个调用都先对照上面的简易类图,看看有没有重名方法,如果有,就要找到最近的方法并查看里面的内容,以此类推:按照这种方法,就会感觉所有代码都在一个文件一样

  • 相关阅读:
    macbook 无声音解决方案
    webapck dev server代理请求 json截断问题
    百度卫星地图开启
    服务器 nginx配置 防止其他域名绑定自己的服务器
    记一次nginx php配置的心路历程
    遇到npm报错read ECONNRESET怎么办
    运行svn tortoiseSvn cleanup 命令失败的解决办法
    svn add 命令 递归目录下所有文件
    m4出现Please port gnulib freadahead.c to your platform! Look at the definition of fflush, fread, ungetc on your system, then report this to bug-gnulib."
    Ubuntu下安装GCC,mpc、mpfr、gmp
  • 原文地址:https://www.cnblogs.com/huchong/p/7710425.html
Copyright © 2011-2022 走看看