小结
元类
因为一切皆对象,类也是对象,元类构造类,类是由元类实例化得到
type 是最顶层的元类
py3中所有的类都继承了object(包括type也继承了object)
object 类由type创造, type类也是由type创造
继承了type的类,都叫元类
class Person(metaclass=Mymeta(我自定义的元类))
# __call__方法讲解
class Mymeta(type):
# def __init__(self):
# pass
def __call__(self, *args, **kwargs):
# 什么时候会触发? 类加括号(实例化产生对象),控制对象的创建
#第一步:调用Person类的__new__方法,产生一个对象
obj = object.__new__(self)
#第二步:调用Person的类的__init__方法,完成初始化
obj.__init__(*args, **kwargs)
return obj #(这里返回的是什么,类加括号实例化得到的就是什么,所有这里可以对 对象的生成做修改,控制对象的创建)
# def __new__(cls, *args, **kwargs):
# pass
class Person(metaclass=Mymeta):
def __init__(self,name):
self.name=name
p=Person('Nick') #(通过控制重新元类的__call__控制对象创建
print(p.name) #Nick
class Mymeta(type):
def __init__(self, name, bases, dic):
#控制类的初始化 (自定义元类加括号实例化类时,调用type的__call__,在调用自定义元类的__init__方法完成初始化,所以在这里可以控制类的初始化)
pass
def __new__(cls, name, bases, dic):
#控制类的产生 (可以修改类里面的属性)
_class=type.__new__(cls, name, bases,dic)
return _class
# Mymeta(name,bases,dic) 会调用type的__call__,内部调用Mymeta的__new__,再调用__init__
class Person(metaclass=Mymeta):
passclass Mymeta(type):
def __init__(self, name, bases, dic):
#控制类的初始化 (自定义元类加括号实例化类时,调用type的__call__,在调用自定义元类的__init__方法完成初始化,所以在这里可以控制类的初始化)
pass
def __new__(cls, name, bases, dic):
#控制类的产生 (可以修改类里面的属性)
_class=type.__new__(cls, name, bases,dic)
return _class
# Mymeta(name,bases,dic) 会调用type的__call__,内部调用Mymeta的__new__,再调用__init__
class Person(metaclass=Mymeta):
pass
单例模式回顾
多次实例化指向的都是同一块内存地址,拿到的都是同一个对象
好处:节约空间
第一种方法(通过类方法)
class Sql
网络编程、
'''
C/S 和 B/S 架构
c:client(客户端) s:server(服务端) ,电脑上装的qq,微信
b:browser(浏览器) s:server(服务端) 京东,天猫
bs架构本质也是cs架构
'''
'''
学校网络编程为了写一个cs架构的软件
c端------网络------s端
'''
'''
s端:
1. 有固定ip
2. 稳定一直运行,支持并发
'''
# 网络:网络连接介质 + 网络协议(osi七层)
# 网络协议: osi七层协议:应表会传网数物
#五层协议:应传网数物
'''
物理层: o1o1o1o1电信号
数据链路层:把物理层的电信号分组,每一组叫一个数据报/数据帧,每一数据帧分成:报头head和数据data两部分
-每一个数据报,都有报头和数据部分
-头:固定18个字节,6:发送者地址/ 6:接收者地址/ 6:数据类型
-mac地址:发送者,接收者地址,就是mac地址
-每块网卡都有一个唯一mac地址:12位16进制数表示(前六位是厂商编号,后六位是流水线号)
-广播:同一个局域网内通信,会出现广播风暴
网络层:
-ip: ipv4:32位2进制表示:点分十进制表示 从0.0.0.0.到255.255.255.255,范围是有限的,不能表示出所有的 网络设备,于是出现了ipv6
-子网掩码:通过子网掩码和ip判断两个ip是否处于同一个网段,通过ip地址和子网掩码做按位与运算
ip地址: 172.16.10.1: 10101100.00010000.00001010.000000001
子网掩码:255.255.255.0 11111111.11111111.11111111.000000000
按位与运算:172.16.10.0 10101100. 00010000.00001010.000000001
-172.16.10.10/24 包含了ip地址和子网掩码
-ip跟mac有转换关系
-主机172.16.10.10/24访问172.16.10.11/24
-ARP协议:广播的方式发送数据包,获取目标主机的mac地址
-mac地址学习:mac地址和ip地址的映射
-第一次接收到就会在ip/mac映射表中添加一条数据{‘172.16.10.11“:ddsadfrersdgsdg}
-任何一种协议都有头和内容
传输层:
tcp协议:
-三次握手,四次牵手(重点,看图),连接如何建立,发数据如何保证可靠,断开如何断开,在建立连接过程中有状态
-服务的如果看到大量的syn_rcvd状态
-dos和ddos攻击:拒绝服务攻击,分布式的拒绝服务攻击
-端口号:端口范围0-65535,0-1023为系统占用端口
-udp协议:
-发送,不需要响应,所以数据不可靠,(如看视频)
-端口
-通过ip+子网掩码唯一确定一台设备
-通过ip+子网掩码+端口号唯一确定一个软件
-半连接池
应用层:
'''
'''
上网流程分析:
-在浏览器输入www.baidu.com
-会取dns服务器通过域名解析成ip地址
-向ip+端口号这个地址发送请求,就会访问到百度的服务器
'''
'''
socket:在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信
在python中通过socket写一个cs架构的软件
'''
3.简单的通信服务端
#导入一个socket模块
import socket
#想象成买手机打电话:socket.SOCK_STREAM 表示建立tcp连接,udp连接socket.SOCK_DGRAM
#买了个手机
soc=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#插电话卡:绑定ip地址 传元组:(ip,端口号)
soc.bind(('127.0.0.1',8080)) #如果写本机ip,局域网外部可以访问
#开机,监听,这个5 是半连接池的大小
soc.listen(5)
#等待别人给我打电话
conn,addr=soc.accept()
# conn 就是通路
# 接收1024个字节
data=conn.recv(1024)
data=data.decode()
print(data.upper())
#conn.sent 发送数据,数据必须是bytes格式
#conn.sent(b'xxx')
#挂断电话
conn.close()
#销毁手机
soc.close()
4.简单的通信客户端
import socket
#创建一个socket对象
soc=socket.socket()
#连接服务端
soc.connect(('192.168.11.252',8080))
#发送消息
soc.send(b'hello word')
# data=soc.recv(1024)
# print('我收到服务端回的',data)
#关闭连接
soc.close()