单例模式:
定义:多次实例化都指向同一个内存地址
单例模式1 (绑定给类来 classmethod)
class People: isinstances = None def __init__(self,name): self.name = name @classmethod def auth(cls): if cls.isinstances == None: cls.isinstances = cls(name) return cls.isinstances else:return cls.isinstances
单例模式2 (装饰器来验证)
name = 'x' def auth(cls): isinstance = cls(name) def inter(*args,**kwargs): if args or kwargs: obj = cls(*args,**kwargs) return obj else:return isinstance return inter @auth class People: def __init__(self,name): self.name = name obj1 = People() obj2 = People() print(obj1) print(obj2)
单例模式3 (通过元类来实现)
class Mymeta(type): def __init__(cls,class_name,bass_class,class_dic): cls.__isinstance = cls('x') def __call__(cls, *args, **kwargs): if args or kwargs: obj = cls.__new__(cls) cls.__init__(obj,*args,**kwargs) return obj else:return cls.__isinstance class auth(metaclass=Mymeta): def __init__(self,name): self.name = name obj1 = auth() obj2 = auth() print(obj1) print(obj2)
单例模式4 (通过倒模块来实现)
def f1(): from settings import isinstances print(isinstances) def f2(): from settings import isinstances print(isinstances) f1() f2()
网络编程
网络编程:
服务端与客户端
服务端:(并发)
同时给多个用户服务
对外一直提供服务
地址一直不变
服务端应支持并发
网络: 用来数据交互(通信)
互联网协议:(统一通信标准)即 OSI 七层协议
OSI 七层协议:
应用层:端口地址( 浏览器默认端口80 )(应用软件,http,ftp)
传输层: TCP协议(三次握手四次挥手)/ udp协议
网络层: IP地址(找到某一个局域网) IP协议 (ARP协议把IP解析成max地址)
数据链路层:(找到某一台计算机) 以太网协议 ethernet
以数据包的形式:ARP协议 (靠吼)
报头:heat (包括发送地址,接受地址) 发送地址,接收地址指网卡的地址(mac)
数据:date
物理层:发送高低电信号(高1,低0)
TCP: 流士协议 (好处是不会丢包,发一份包过去一定要收到回应,没收到再发)
TCP 三次握手(建链接),四次挥手(断链接)
三次握手: SYS_SENT 表示客户端向服务端发送连接请求
SYS_RCVD 服务端同意同时向客户端发送连接请求
ESTABLISHED 客户端同意收到服务端发送的链接请求 established
ESTABLISHED 服务端收到同意链接请求
四次挥手:客户端向服务端发送数据的这条管道
FIN_WAIT_1:客户端向服务端发送断连接请求
CLOSE_WAIT:服务端同意请求
FIN_WAIT_2:客户端收到回应
客户端向服务端发送数据的这条管道断开
服务端向客户端发送数据的这条管道
LAST_WAIT:服务端向客户端发送断连接请求
TIME_WAIT:客户端同意断连接请求
基于网络协议通信的套接字( AF-INET)
import socket # 买手机 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 绑定自己的IP地址与端口地址 phone.bind(('130',8080)) # 开机 phone.listen(5) # 同一时刻最大请求数为 5 个 # 等待别人发请求 conn,client_adress = phone.accept() # 双向套接字对象,存放客户端的 IP 与 端口的小元祖 # 收消息 date = conn.recv(1024) # 接收的最大字节数 print('收到客户的信息:%s'%date) # 发消息 conn.send(date.upper()) conn.close() phone.close()
import socket # 客户端不需要绑定自己的 IP 与 端口 # 买手机 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 拨号(需要知道服务端的IP) phone.connect(('192.168.13.232',8085)) # 发消息 phone.send('+++++++ your is sb ++++++'.encode('utf-8')) # 收消息 date = phone.recv(1024) print('收到服务端的信息:',date.encode('utf_8')) # 断链接 phone.close()