小结9.10

1. socketserver源码分析

import socketserver

class Mytcp(socketserver.BaseRequestHandler):
    def handle(self):
        # self.server  ThreadingTCPServer的对象:
        # self.request   conn
        # self.client_address  addr
        pass

if __name__ == '__main__':
    server = socketserver.ThreadingTCPServer(('127.0.0.1',8000),Mytcp)
    # server = socketserver.ThreadingUDPServer(('127.0.0.1',8000),Mytcp)
    '''
    1 ThreadingTCPServer实例化:走__init__方法
        ThreadingTCPServer(ThreadingMixln,TCPServer)的__init__方法,没有,走的父类:TCPServer(BaseServer)的__init__
        TCPServer(BaseServer)的__init__又调用了父类的__init__
            赋值操作:self.server_address = server_adress
                    self.RequestHandlerClass = RequestHandlerClass
            数据放到水当中了?放到了server这个对象中
        socket.bind()
        socket.listen()
    2 server.serve_forever()
        一堆代码不需要管:self._handle_request_noblock
            request,client_address = self.get_request()
                self.get_request()在Tcpserver这个类:self.socket.accept()
            self.process_request(request,client_adress):ThreadingMixln类的process_request
                开启线程执行ThreadingMixln类的process_request_thread,执行了finish_request(request,client_address,self)在BaseServer类中
                     request:就是连接对象,conn
                     client_address:客户端ip和端口
                     self:server对象,实例化得到的server对象
                     实例化RequestHandlerClass得到一个对象:会走__init__方法
                     RequestHandlerClass没有,走的BaseRequestHandler类的__init__
                     会执行handle方法,通信逻辑
                     
    '''
    server.serve_forever()

2. 面向对象串讲

'''
类与对象
    __init__

'''

class Person:
    school = 'xxx'
    def __init__(self):  # 对象初始化方法,对象的绑定方法,对象来调用会把对象传过来
        self.name = 'xxx'

p = Person()  # 类实例化产生对象会调用__init__
print(p.school)
Person.school = 'uuu'
p.school = 'yy'
print(p.school)

'''
属性查找:包括数据属性,包括方法
    数据属性:对象中找---》类中---》父类(mro列表)---》obj   py2中没有mro这个东西
    方法查找:对象的绑定方法---》父类中按照mro列表查找---》obj
'''

'''
绑定方法:
    定义在类内部,没有被任何装饰器装饰的函数,就是方法
    给对象来用 对象.方法() 默认把对象自身传过去  ***特殊之处
    类来调用就是普通函数,有几个值就传几个值
'''

'''
对象之间的交互
    把一个对象传到另一个对象中,操作这个对象
    人狗大战
'''

'''
三大特性:继承 封装 多态
    继承:
        在类名后的括号中写要继承的类,用逗号分隔
        py中支持多继承(属性查找顺序)
        新式类和经典类
            继承了object的类都叫新式类(py3中都是新式类)
            py2中才有新式类,经典类之说
        菱形问题的查找:
            广度优先:新式类
            深度优先:经典类
        mro列表
        super() 特殊对象,调用父类的方法和属性(严格按照mro列表找的)
        self和super的区别:self一定是从根本上找,super()从当前位置按照mro列表找
        类名.方法()  就是个普通函数,这个就不按照mro列表找了,指名道姓的来用
        派生:子类多出来的属性,方法
    多态和多态性:
        一个事物多种形态
        多态性:执行同一个事物的同一个方法,表现出来的结果是不一样的
        两种限制子类必须实现什么方法的方式
            abc模块
            raise抛异常
        鸭子类型:走路像鸭子,你就是鸭子
        len()  调用对象.__len__()
    封装:
        把属性和方法隐藏
            以__开头,就会隐藏
            并没有实际隐藏(做了变形)
            隐藏属性:保证数据安全
            隐藏方法:隔离复杂度
            property 装饰器 包装成数据属性
    其他两个装饰器:
        classmethod:类的绑定方法:可以类来调用会自动把类传入(对象也可以调用)
        staticmethod:静态方法,谁都可以调用,不会自动传参数
    元类:
        __call__
        __new__
        __getattr__
        __setattr__
        __delattr__
        type和object
    反射:(通过字符串去获取,删除,修改 对象的属性或方法)
        hasattr
        getattr
        setattr
        delattr
    isinstance和issubclass
    
'''

3. 网络编程

'''
网络是什么:链接介质 + 协议
协议:osi7层
5层协议:
    物理层:电信号
    数据链路层:做分组:数据报/数据帧   mac
    网络层:ip 通过ip得到mac地址---arp协议   mac地址学习
    传输层:tcp/udp  三次握手四次挥手,可靠传输
    应用层:写的程序都是应用层,基于socket(基于网络和传输抽象出来的)

socket编写tcp的客户端和服务端:
    传输文件:自己定制了协议
    粘包问题中级解决方案
        struct模块先把头的长度包成4个字节,发送4个字节
        发送头
        发送内容
        接收端:
            接收4个字节,解除头部长度
            接收头部,取出数据长度
            接收数据长度

socket编写udp的客户端和服务端
    不需要建立连接,传输不可靠,数据报协议(自己有头)

socketserver写支持并发的服务端
'''

# with 上下文管理器
with open('a.avi','rb') as f:
    for line in f:
        print(line)

class Open():
    def __enter__(self):
        print('xxxx')
        pass
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('yyyy')
        pass

with Open() as f:
    # 代码
    f.name = 'xxxx'
posted @ 2019-09-10 17:34  PLPLPL  阅读(164)  评论(0编辑  收藏  举报
// 目录