网络基础

一.面型对象多继承

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算法适应新式类中较复杂的如果对于简单的,可以这样快速记忆(留个根)


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都是字符串
posted @ 2018-09-03 15:23  ★行者尚★  阅读(165)  评论(0编辑  收藏  举报