网络基础
一.面型对象多继承
1.例子
1 class A(object):
2 def f1(self):
3 print('a')
4
5 class B(object):
6 def f1(self):
7 print('b')
8
9 class C(A,B):
10 def f1(self):
11 print('c')
先找左,再找右
2.经典类和新式类(python3里只有新式类)
区别:查找的流程顺序不同
py2:
经典类
新式类:自己或自己的前辈只要有人继承了object,那么此类就是新式类
py3:
新式类
经典类:一条道走到黑.(深度优先)
新式类:不是广度优先,是通过C3算法实现的.
C3算法:(在py2.3的官方文档中可找到)
Foo+(B,C,D,F,G)+(I,G,D,G,W)+(I,G,D,G,W)
获取第一个表头,和其他的表尾进行比较(每拿走一个都要回到第一个表头重新开始)
不存在则拿走
存在,则放弃,然后获取第二个表的表头 ,再和其他表的表尾进行比较
经典类:
广度优先:
C3算法例:
1 class A(object):
2 pass
3
4 class B(A):
5 pass
6
7 class C(B):
8 pass
9
10 class D(object):
11 pass
12
13 class E(D,C):
14 pass
15
16 class F(object):
17 pass
18
19 class G(F):
20 pass
21
22 class H(C,G):
23 pass
24
25 class Foo(E,H):
26 pass
27
28 print(E.__mro__) #(<class '__main__.E'>, <class '__main__.D'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
29 print(H.__mro__)
30 print(Foo.__mro__)
知识点:
print(函数名.__mro__) #打印E函数的继承顺序 super就是遵循的这个罗流程python2中没有__mro__
实例图解:
1 L(Foo+L(E)+L(H))
2
3 L(E)=(D,object)+(C,B,A,object)
4 ED
5 L(E)=(object)+(C,B,A,object)
6 EDC
7 L(E)=(D,object)+(B,A,object)
8 EDCB
9 L(E)=(D,object)+(A,object)
10 EDCBA
11 L(E)=(D,object)+(object)
12 EDCBAobject
13
14 L(H)=(C,B,A,object)+(G,F,object)
15 HC
16 L(H)=(B,A,object)+(G,F,object)
17 HCB
18 L(H)=(A,object)+(G,F,object)
19 HCBA
20 L(H)=(object)+(G,F,object)
21 HCBAG
22 L(H)=(object)+(F,object)
23 HCBAGF
24 L(H)=(object)+(object)
25 HCBAGFobject
26
27 L(Foo)=(E,D,C,B,A,object)+(H,C,B,A,G,F,object)
28 Foo,E,D,H,C,B,A,G,F,object
C3算法适应新式类中较复杂的如果对于简单的,可以这样快速记忆(留个根)
C3算法的本质就是Merge,不断地把mro()函数返回的序列进行Merge,规则如下:
1. 如果第一个序列的第一个元素,是后续序列的第一个元素,或者不再后续序列中再次出现,则将这个元素合并到最终的方法解析顺序序列中,并从当前操作的全部序列中删除。
2. 如果不符合,则跳过此元素,查找下一个列表的第一个元素,重复1的判断规则
二.网络基础
a.软件
客户端:C/S架构,Client --> Servr 客户端与服务端架构
浏览器:B/S架构,Browser -> Sever 浏览器端与服务端架构
什么是bs架构,什么是cs架构
bs是通过浏览器访问的,cs是通过客户端访问
在cmd中ipconfig可以可以查看自己的地址
b.如何实现相互通信
(1)编写两个软件,软件之间相互通信
(2)两个人之间通信用网线
(3)一个地区的多个机器相互通信用交换机
使用IP地址:ipconfig/ifconfig
我的:192.168.13.56(局域网的范围是0-255)
(4)公网IP(全球有限,可以租公网IP)
相互之间通信本质上都是01010101
交换机的作用(让相互之间组成一个局域网)
通过ipconfig查看的是内网IP
c.基于socket模块实现网络通信
例
1 import socket #引入socket模块
2 sever=socket.socket() #socket模块的py文件中有一个socket类,将这个类实例化(创建了一个socket对象)
3 # 绑定IP和端口
4 sever.bind(('192.168.13.137',8002)) #绑定一个地址(), 端口(为了让程序和程序之间相互隔离)
5
6 sever.listen(5) #后面最多排五个
7 # 等待客户端来连接,如果没人来连接,就一直等
8 conn,addr=sever.accept() ########在此会阻塞
9 # print(conn,addr) #conn是客户端和服务端连接的对象,服务端以后就要通过该对象进行收发数据
10 #addr是客户端的地址信息
11 print('有人来连接了',conn,addr)
12 data=conn.recv(1024) #最多一次性接收1024字节
13 print(data)
14 # 服务端通过伞,给客户恢复了一个消息
15 conn.send(b'stop')
16 # 放开那把伞
17 conn.close()
18 # 关闭服务端
19 sever.close()
1 import socket
2
3 client=socket.socket()
4 # 阻塞,直到连接成功后才继续往下走
5 client.connect(('192.168.13.137',8002)) #里面只能装一个元组
6 # 连接上服务端后,向服务端发送一个消息
7 client.send(b'hello,')
8 # 客户端等待服务端回复消息
9 data=client.recv(1024)
10 print(data)
11 # 关闭自己
12 client.close()
应用socket模块实现登录
1 import socket
2
3 sever=socket.socket()
4
5 sever.bind(('192.168.13.137',8011))
6
7 sever.listen(9)
8 while True:
9
10 conn,addr=sever.accept()
11
12 username=conn.recv(1024)
13 password=conn.recv(1024)
14 f=open('chect.txt',mode='r',encoding='utf-8')
15 for line in f:
16 name,pwd=line.strip().split('@@')
17 if name==username.decode('utf-8') and pwd==password.decode('utf-8'):
18 conn.send('登录成功'.encode('utf-8'))
19 break
20 else:
21 continue
22
23 else:
24 conn.send('用户名或密码错误'.encode('utf-8'))
1 import socket
2
3 client=socket.socket()
4
5 client.connect(('192.168.13.137',8011))
6
7 name=input('请输入用户名:')
8 pwd=input('请输入密码:')
9
10 client.send(name.encode('utf-8'))
11 client.send(pwd.encode('utf-8'))
12
13 ret=client.recv(1024)
14 print(ret.decode('utf-8'))
15 client.close()
为什么网络通信发送的是字节
py3,send,rece都是字节
py2,send,rece都是字符串
改变世界,改变自己!