博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面向对象与网络编程的总结
阅读量:5291 次
发布时间:2019-06-14

本文共 5362 字,大约阅读时间需要 17 分钟。

目录

面向对象与网络编程的总结

一、面向对象

1.1 类和对象

1.类和对象

#类class 类名:    pass

2.获取类的属性和方法

类.__dict__

3.类调用属性和方法

类名.属性/方法

4.产生对象

类加括号产生对象

5.对象获取属性和方法

对象.__dict__

6.对象调用属性和方法

对象.属性/函数

7.属性查找顺序

自身-->类——>报错

8.对象赋属性

1)

stu1 = Student()stu1.name = 'nick'

2)通过__init__

-在类中定义该方法,方法上写一些参数

-在对象实例化产生对象时,在括号中传的值,会被传到__init__中

class Student:    school = 'oldboy'  #变量表示属性    def __init__(self,name):        self.name=name   stu1=Student('jiayi')print(stu1.name)

9.绑定方法

定义在类内部的方法

-类来调用:就是一个普通函数,有几个参数就需要传几个参数

-对象来调用:它叫对象的绑定方法,第一个参数不需要传,自动传递

1.2 继承

继承了一个类,类中的属性和方法就在子类中了

1.新式类和经典类

新式类:继承object类,py3中默认都是新式类

经典类:不继承object类,py2中有经典类和新式类之分

2.多层继承

class D(object):  #D继承object    passclass C(D):      passclass B(C):      passclass A(B):    #A继承B,C,D    pass

3.多继承

class D:  #D继承object    passclass C:      passclass B:      passclass A(B,C,D):    #A继承B,C,D    pass

4.继承的菱形问题

新式类:广度优先

经典类:深度优先

5.属性的查找顺序

对象----类---父类----报错

6.重用父类的方法

1)指名道姓的用

2)super()方法,遵循mro列表

7.组合

对象的属性是另一个对象

class Foo:    passclass Bar:    passf = Foo()f.bar = Bar()

8.什么时候用继承,什么时候用组合

继承:什么是什么 eg:学生、老师都是人

组合:什么有什么 eg:学生、老师都有课程这个方法

1.3 多态与多态性

多态:一种事物的多种体现

多态性:调用同一个函数,有不同的实现方法,一种接口,多种实现

1.如何用多态

1)abc实现接口统一化

2)raise抛异常

2.鸭子类型

外形,走路像鸭子就是鸭子,人为约束

3.多态性的好处

1)增加程序的灵活性

2)增加了程序的可扩展性

1.4 封装

1.什么是封装

隐藏对象的属性和方法,仅对外提供公共访问接口

2.封装的实现

  • 隐藏属性:提高安全性

    __变量名

  • 隐藏方法:隔离复杂度

    __方法名

3.property装饰器

把方法包装成数据属性

1.5 绑定方法和非绑定方法

1.类的绑定方法

绑定给类,类来调用,会把类自身传过去(拿到一个类就得到一个对象)

2.classmethod和staticmethod装饰器

classmethod:类的绑定方法,可以类来调用,对象也可以调用,只是默认传递的第一个参数还是这个对象对应的类 staticmethod:静态绑定方法,定义在类内部,谁都不绑定,谁都可以调用

3.issubclass和isinstance

issubclass:判断第一个类是不是第二个类的子类isinstance:判断第一个参数是不是第二个参数的对象,返回True或Flase

1.6 反射和内置方法

1.反射

- hasattr():判断一个属性是否在对象中,返回True或Flase- getattr():通过字符串获取属性和方法,如果获取到了,就会返回相应的属性和方法- setattr():通过字符串设置属性和方法- delattr():通过字符串删除属性和方法

2.点拦截方法

__getattr__:如果去对象中取属性,一旦取不到,会进入到__getattr____setattr__:如果去对象中赋值属性,一旦取不到,会进入__setattr____delattr__:如果删除对象中的属性,一旦取不到,会进入__delattr__

3.__item__系列

对象通过[]取值、赋值、删除值的时候会调用

4.上下文管理器

本质就是__enter__exit__

1.7 元类

实例化产生类的类

1.class底层原理分析

type传一堆参数实例化产生一个Person类

type(object_or_name, bases, dict)分别传三个参数

2.三个魔法方法

__init__:初始化空对象

__call__:控制对象的产生

__new__:创建空对象

3.有了元类之后的查找顺序

  • 类的查找顺序:类本身---父类--自定义元类---type元类---报错
  • 对象的查找顺序:自身---类---父类---报错

1.8 单例模式

1.通过类的绑定方法

class Sql():      _instance = None      def __init__(self,port,host):        self.port = port        self.host = host    @classmethod       def get_singleton(cls):          import settings             if not cls._instance:               cls._instance = cls(settings.PORT,settings.HOST)           return cls._instance

2.通过装饰器

import settingsdef get_singleton(cls):    _instance = cls(settings.PORT,settings.HOST)    def wrapper(*args,**kwargs):        if len(args) ==0 and len(kwargs) == 0:            return _instance        return cls(*args,**kwargs)    return wrapper@get_singletonclass Sql():    def __init__(self,port,host):        self.port = port        self.host = host

3.通过元类实现

import settingsclass Mymeta(type):    def __init__(self,name,bases,dic):  #self是Sql类        self._instance = self(settings.PORT,settings.HOST)    def __call__(self, *args, **kwargs):  #self是Sql类        if len(args) == 0 and len(kwargs) == 0:                return self._instance        obj = object.__new__(self)        obj.__init__(*args, **kwargs)        return obj

4.通过导入模块实现

def test():    from singleton import s1    print(s1)  #这个s1和下面的s1不是一个,但是值相同def test2():    from singleton import s1,Sql    print(s1)  #这个s1和上面的s1不是一个,但是值相同    obj = Sql(3306,'192.168.1.1')  #传参的时候生成一个新的空对象    print(obj)  #打印传进去的对象

二、网络编程

2.1协议

1.c/s和b/s架构

c/s:客户端和服务器

b/s:浏览器和服务器,本质上还是客户端和服务器

2.osi五层

  • 物理层:高低压电信号

  • 数据链路层:数据报、mac地址
  • 网络层:IP协议和端口号(IP可以通过arp协议,和mac地址进行转换)
  • 传输层:TCP和UDP协议

TCP:基于数据流的可靠协议(三次握手、四次挥手)

UDP:基于数据报的不可靠协议

  • 应用层:http协议,邮件协议等

2.2 socket

在传输层和应用层之间的一层抽象层,可以操作网络层和传输层

1.用套接字实现tcp协议的通信

2.用套接字实现的UDP协议的通信

3.发生粘包的两种情况

  • 发送端需要等缓冲区满才发送出去,造成粘包(发送时间间隔很短,数据又很小,会合到一起,产生粘包)
  • 接收端不及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次手的时候还是从缓冲区呐上次一流的数据,产生粘包)

4.解决粘包的问题

  • 为字节流加上固定的报头,报头中含有字节流的长度,一次send到对端,对端在接收时,先从缓存中取出定长的报头,然后再取真实数据。

    struct()模块,将数据长度打包为四个int型的字节

  • 把报头做成字典,字典里面包含将要发送的真实数据长度,数据名,md5等等的信息,,然后json序列化,然后用struck将序列化后的数据长度打包成4个字节,一同send到对端

    发送时:先发报头长度再编码报头内容然后发送最后发真实内容接收时:先手报头长度,用struct取出来根据取出的长度收取报头内容,然后解码,反序列化从反序列化的结果中取出待取数据的详细信息,然后去取真实的数据内容

5.UDP协议

  • 用udp实现简单通信

    #服务器import socketsoc= socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  #socket.SOCK_DGRAM是UDP协议soc.bind(('127.0.0.1',8080))   #绑定地址和端口号while True:  #通信循环    data,addr = soc.recvfrom(1024)  #无需等待接收和监听    print(data)    soc.sendto(data.upper(),addr)  #将处理好的数据发送给客户端
    #客户端import socketsoc = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  #实例化一个对象while True: #通信循环    msg= input('请输入数据>>>').strip()    msg = msg.encode('utf8')  #将数据转化为bytes格式    soc.sendto(msg,('127.0.0.1',8080))    data = soc.recvfrom(1024)   #接收数据    print(data[0]) #打印数
  • udp的特点:

    可以发送空内容

    不需要建立连接

    客户端和服务端谁断开都不影响发送

    不会粘包

6.socketserver模块

1) socketserver模块实现TCP简单通信

服务端

import socketserverimport structimport osfrom conf import settings#自己定义一个类,必须继承BaseRequestHandlerclass MyTcp(socketserver.BaseRequestHandler):    #必须重写handle方法    def handle(self):        try:            while True :  #通信循环            ###########            ##逻辑代码##            ###########        except Exception:            passsocketserver.ThreadingTCPServer(('127.0.0.1',8080),MyTcp)`* `soc.serve_forever() `

客户端:用socket模块就行

2)socketserver模块实现UDP简单通信

书写步骤同上

转载于:https://www.cnblogs.com/demiao/p/11502921.html

你可能感兴趣的文章
苹果手表:大方向和谷歌一样,硬件分道扬镳
查看>>
ccf 出现次数最多的数
查看>>
单例模式
查看>>
Competing Consumers Pattern (竞争消费者模式)
查看>>
HDUOJ ------1398
查看>>
cf--------(div1)1A. Theatre Square
查看>>
Android面试收集录15 Android Bitmap压缩策略
查看>>
Tomcat 报错的解决方法:The APR based Apache Tomcat Native library which allows optimal
查看>>
最长公共子串问题(LCS)
查看>>
TortoiseSVN is locked in another working copy
查看>>
PHP魔术方法之__call与__callStatic方法
查看>>
ubuntu 安装后的配置
查看>>
Html学习_简易个人网页制作
查看>>
angular中ng-bind指令小案例
查看>>
jqery总结
查看>>
Lodop获取客户端主网卡ip地址是0.0.0.0
查看>>
VSCODE更改文件时,提示:EACCES: permission denied的解决办法(mac电脑系统)
查看>>
web前端之路,js的一些好书(摘自聂微东 )
查看>>
【模板】对拍程序
查看>>
微信小程序开发初体验
查看>>