day27 python面向对象多继承 网络编程 socket模块
一.面向对象多继承之c3算法
1.简单继承
class A:
def f1(self):
print('A')
class B:
def f1(self):
print('B')
class C(A,B):
def f1(self):
print('C')
obj = C()
obj.f1() #继承顺序: 先找自己, 然后先找左, 再找右
2.经典类和新式类
经典类: 没有继承object的类
新式类: 继承了object的类
py3
都是新式类: 默认都是继承object, 所以都是新式类
py2.2以后, 才出现了经典类和新式类
新式类: 如果自己或自己的父类, 有人继承了 object , 那么此类就是新式类: 按c3算法查找
经典类: 和新式类的查找顺序不一样: 一条道走到黑(深度优先),
3.c3算法
class A:
pass
class B(A):
pass
class C(B):
pass
class D:
pass
class E(D,C):
pass
class F:
pass
class G(F):
pass
class H(C,G):
pass
class Foo(E,H):
pass #继承顺序之c3算法:
#自己先拿出来, 最优先,先安放好
L(E) = D,object + C,B,A,object #拿出第一个的表头,和第二个(除表头)比, 如果没有相等的, 把第一个表头去掉并安放好
>>>E,D,C,B,A,object #如果有相等的, 第一个表头就不动, 然后从第二个拿出表头, 和第一个(除表头比)
#依次类推, c3 算法可以得到继承顺序
L(H) = C,B,A,object + G,F,object
>>>H,C,B,A,G,F,object
L(Foo) = E + H
L(Foo) = E,D,C,B,A,object + H,C,B,A,G,F,object
>>>Foo,E,D,H,C,B,A,G,F,object
4.验证c3算法: 类名.__mro__
print(Foo.__mro__) #查看这个类的继承顺序
>>>(<class '__main__.Foo'>, <class '__main__.E'>, <class '__main__.D'>, <class '__main__.H'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.G'>, <class '__main__.F'>, <class 'object'>)
5.面向对象的注意事项
super()是遵循 __mro__ 执行顺序, python2里没有__mro__这个功能, python3中才有
二.网络基础
网络编程
客户端:
cs架构: client - server
浏览器: bs架构 browser - server
如何实现相互通信
需求: 编写两个软件, 软件之间能相互通信
三.编写网络相关的程序
1.基于socket模块实现网络通讯
1.1.server端
import socket
print('in server')
server = socket.socket() #创建了一个socket对象
server.bind(('127.0.0.1', 65530)) #绑定ip和端口
server.listen(5) #后面可以等5个人
conn, addr = server.accept() #等待客户端来连接,如果没人来就傻傻地等 #conn服务端和客户端连接的对象,服务端以后要通过该对象进行收发数据; addr是客户端的地址信息
print(conn,addr)
data = conn.recv(2048) #收数据: 通过对象获取客户端的信息, 一次性最多(最大)接收多少字节
print(data)
conn.send(b'my name is bajie') #发数据: 发的也是字节
conn.close() #与客户端断开连接
server.close() #断开服务端的连接
1.2.client端
import socket
print('in client')
client = socket.socket()
client.connect(('127.0.0.1',65530))
client.send(b'client connect')
data = client.recv(2048)
print(data)
client.close()
2.为什么网络通信发送的是字节, 而不是字符串
在py3的时候: send/recv都是字节; 字符串默认是unicode编码(占资源,所以要传字节码,目的是空间压缩)
在py2的时候: send/recv都是字符串, 和socket无关, 和编码有关
哪里会阻塞:
server: accept/recv
client: connect/recv
2.1.server端
import socket
server = socket.socket()
server.bind(('127.0.0.1', 65532))
server.listen(5)
while True:
conn,addr = server.accept()
while True:
data = conn.recv(2048)
if data == b'exit':
break
else:
responce = data + b'--bajieaishuishui'
conn.send(responce)
conn.close()
server.close()
2.2.client端
import socket
client = socket.socket()
client.connect(('127.0.0.1', 65532))
while True:
data = input('>>> ')
if data == 'exit':
break
client.send(data.encode('utf-8'))
message = client.recv(2048)
print(message.decode('utf-8'))
3:传输层的端口范围
0<- well-known ->254<- 保留unix ->1024<- 自定义 ->65536