淘宝客网站开源,做专题页的背景网站,宁波seo推广报价多少,购物网站开发过程文章目录 python高级基础闭包修饰器单例模式跟工厂模式工厂模式单例模式 多线程多进程创建websocket服务端手写客户端 python高级基础
闭包 简单解释一下闭包就是可以在内部访问外部函数的变量#xff0c;因为如果声明全局变量#xff0c;那在后面就有可能会修改 在闭包中的… 文章目录 python高级基础闭包修饰器单例模式跟工厂模式工厂模式单例模式 多线程多进程创建websocket服务端手写客户端 python高级基础
闭包 简单解释一下闭包就是可以在内部访问外部函数的变量因为如果声明全局变量那在后面就有可能会修改 在闭包中的内部函数如果要修改外部变量就要借助nonlocal关键字 def outer(num1):def inner(num2):nonlocal num1num1num2print(num1,num2)return inner
fnouter(10)
fn(10) # 20
fn(10) # 30修饰器
闭包修饰器语法
def outer(fn):def inner():print(我睡觉了)fn()print(醒了)return innerdef sleep():import randomimport timeprint(睡眠中。。。)time.sleep(random.randint(1,5))fn1outer(sleep)
fn1()注意看加粗的两个地方是语法糖 实际原理还是用的是闭包
单例模式跟工厂模式
工厂模式 优点创建出来的每个对象都是独立的地址 缺点部分属性不一致但是都是独立的内存消耗内存性能 class Person:pass
class Student(Person):pass
class Worker(Person):pass
class Teacher(Person):passclass PersonFac:def get_person(self,type):if(types):return Student()elif(typew):return Worker()else:return Teacher()pfPersonFac()
workerpf.get_person(w)
stupf.get_person(s)
teacherpf.get_person(t)print(worker,stu,teacher)单例模式
实例化类然后在这个单例类上面进行添加删除
# class Stu:
# pass
#
# t1Stu()
# t2Stu()
# print(id(t1)) # 1755386051920
# print(id(t2)) # 1755386051984# 单例写法 工作中常把创建类单独提出文件 然后引入
class Stu:passt1Stu()s1t1
s2t1
print(id(s1)) # 1790597823824
print(id(s2)) # 1790597823824多线程多进程 以下代码是单线程执行最终输出结果是一直执行sing方法因为是无限循环的 import timedef sing():while True:print(我在唱歌。。。)time.sleep(1)def dance():while True:print(我在跳舞。。。)time.sleep(1)if __name____main__:sing()dance()def sing(msg):while True:print(msg)time.sleep(1)def dance(msg):while True:print(msg)time.sleep(1)if __name____main__:singThreadthreading.Thread(targetsing,args(我要唱歌,)) # 使用Thread方法开启线程 参数要一一对应不然就会跑到第一个参数所以这边使用具名参数danceThreadthreading.Thread(targetdance,kwargs{msg:我在跳舞})singThread.start() # 线程启动danceThread.start()这里面2个注意点 以元祖形式传参一个参数别忘了逗号以字典形式传参参数要与方法参数一一对应不然会报错参数名也不能变 创建websocket
服务端
import socket
# 创建socket对象
socket_serversocket.socket()
# 绑定ip地址和端口
socket_server.bind((localhost,8888))# 千万注意这里的传参是元组
# 监听端口
socket_server.listen(1)
# listen接收一个整数传参数表示接收的链接数量# 等待客户端链接
# result:tuplesocket_server.accept()
# connresult[0] # 客户端和服务端的链接对象
# addressresult[1] # 客户端的地址信息
# 简写
conn,address socket_server.accept() # 返回的是二元元祖连接对象客户端地址信息
# 此方法是阻塞的 accept 如果没有链接下面的代码不执行print(f接收到了{address})
# 无线循环发消息 最终根据最后逻辑进行跳出自行解决
while True:data:strconn.recv(1024).decode(GBK)print(f客户顿发来的信息是{data})msginput(发送信息).encode(GBK)conn.send(msg)#关闭链接
conn.close()
socket_server.close()
如果报这种错说明你的数据不是utf-8的格式就可以打印出信息进行转换对应的格式 这种是GBK格式自行百度 最终实现的效果
手写客户端
import socket
# 创建socket对象
socket_clientsocket.socket()
# 绑定ip地址和端口
socket_client.connect((localhost,9999))
while True:msginput(请输入)socket_client.send(msg.encode(UTF-8)) # 输入信息转换recv_datasocket_client.recv(1024) # recv缓冲区1024即可 单线程阻塞print(f服务端返回的信息四{recv_data.decode(UTF-8)})
socket_client.close()