1、面向對象多繼承(c3算法)python
a、有多個父類先找左,再找右,以下示例:linux
class A(object): pass class B(object): def f1(self): print('B') class C(A,B): pass obj = C() obj.f1() print(C.__mro__) # 打印出C類的繼承順序,結果以下一行: # (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
b、經典類和新式類算法
python2(實際上是python2.2之後):windows
經典類瀏覽器
新式類:若是本身或本身的前輩只要有人繼承object,那麼此類就是新式類。服務器
python3:網絡
新式類架構
經典類和新式類的查找成員的順序不同:socket
經典類:一條道走到黑(深度優先);ide
新式類:c3算法實現(python2.3更新時有介紹c3算法);
Foo + (C,D,F,G) + (G,D,G,W) + (I,G,D,G,W)
Foo, I,B,……
獲取第一個表頭 和 其餘表尾進行比較:
不存在則拿走。
若是存在,則放棄,而後獲取第二個表的表頭再次和其餘表的表尾進行比較。
總結:
經典類:一條道走到黑(深度優先);
新式類:簡單理解就是留個根,(科學原理是c3算法);
注意事項:super是遵循__mro__的執行順序的。
2、網絡基礎
a、開發模式:
(開發一個軟件)須要安裝客戶端:CS架構,client -- > server
(開發一個網站)使用瀏覽器訪問:BS架構,browser -- > server
b、如何實現相互通訊:
方式一:編寫兩個軟件,軟件之間相互通訊;
方式二:兩我的直接鏈接(經過網線);
方式三:同一個教室中的多臺電腦相互通訊(經過交換機);
使用IP地址:ipconfig/ifconfig查看
方式四:和三亞的女朋友通訊(經過交換機 + n*路由器);
三亞女朋友須要 租公網IP
總結:
1)相互通訊的本質是發送01010101(高低電頻);
2)交換機的做用(組成一個局域網,並在局域網內發廣播);
3)經過ipconfig(windows系統)/ifconfig(蘋果系統和linux系統)查看本身的內網IP;
4)花錢 租公網IP;
3、編寫網絡相關的程序
a、基於socket模塊實現網絡通訊,以下代碼示例:
服務端簡單示例:
import socket #導入模塊 socket(騷k特) server = socket.socket() # 建立服務端socket 對象 ip_port = ('192.168.15.57',8001) #建立ip和端口 server.bind(ip_port)#綁定ip和端口 bind(班的) server.listen()#開機 listen(雷森) print('服務端準備開始接收客戶端的鏈接') # 等待客戶端來鏈接,若是沒人來就傻傻的等待。 # conn 是客戶端和服務端鏈接的對象(傘),服務端之後要經過該對象進行收發數據。 # addr 是客戶端的地址信息。 # #### 阻塞,只有有客戶端進行鏈接,則獲取客戶端鏈接而後開始進行通訊。 print('等待中') conn,addr = server.accept()#阻塞中 accept(A可賽科特) print('已經有人鏈接上了,客戶端信息:',conn,addr) # 經過對象去獲取(客戶端經過傘給我發送的消息) # 1024表示:服務端經過對象(傘)獲取數據時,一次性最多拿1024字節。 client_smg = conn.recv(1024) client_smg = client_smg.decode('utf-8')#解碼 decode(抵扣的)解碼 print(client_smg)#看一下客戶端發給我什麼內容 conn.send('你猜'.encode('utf-8'))#給客戶端回覆一個消息 encode(銀扣的)編碼 conn.close()# 與客戶端斷開鏈接(放開那把傘) close(可樓子) server.close()# 關閉服務器的服務
客戶端簡單示例:
import socket client= socket.socket()#建立客戶端socket對象 #客戶端向服務器發起鏈接請求(遞傘) #阻塞,去鏈接,直到鏈接成功後纔會繼續向下走 server_ip_port = ('192.168.15.57',8001) client.connect(server_ip_port)# 連接服務端connect(肯奶可特) #鏈接上服務端後,向服務端發送信息 client.send('約嗎'.encode('utf-8')) #客戶端等待服務器給他發送消息 from_msg = client.recv(1024) recv(蕊c無) from_msg_0 = from_msg.decode('utf-8')#解碼 print(from_msg_0)#消息發送來了 client.close()
總結:
服務端:
accept,阻塞:等待客戶端來鏈接。
recv, 阻塞:等待客戶端發來數據。
客戶端:
connect,阻塞:一直在鏈接,直到鏈接成功才往下運行其餘代碼。
recv, 阻塞:等待服務端發來數據。
問題一:爲何要網絡通訊發送的是字節?而不是字符串?
python3,send/recv 都是字節
python2,send/recv 都是字符串
b、上述示例運行一次,服務端和客戶端只能鏈接一次,發送和接收一次消息後服務端關閉,沒法再鏈接其餘客戶端,現要實現服務端一旦啓動,服務端和客戶端之間能夠持續發送和接收消息,且與某個客戶端斷開後還能夠繼續等待其餘客戶端來鏈接,以下示例:
加一個while循環
socket模塊實現網絡通訊UDP
服務端
import socket #建立一個udp協議下的socket,須要使用參數type udp_server = socket.socket(type=socket.SOCK_DGRAM) #DGRAM : datagram 數據報 #拿到一個地址,啓動程序的時候,告訴電腦,你給我這個程序分配8001端口. ip_port = ('192.168.15.113',8001) #綁定IP地址和端口 udp_server.bind(ip_port) print('準備接收消息了...') #接收消息,from_client_msg來自客戶端的消息,client_addr客戶端的地址('192.168.15.113', 8001) from_client_msg,client_addr = udp_server.recvfrom(1024) #阻塞住了 #發送消息 udp_server.sendto(b'gunduzi',client_addr) #關閉udp的socket對象 udp_server.close()
客戶端
import socket udp_client = socket.socket(type=socket.SOCK_DGRAM) server_ip_port = ('192.168.15.113',8001) udp_client.sendto(b'hello',server_ip_port) sendto(森頭) from_server_msg,server_addr = udp_client.recvfrom(1024) recvfrom(蕊c無服ruang木) print(from_server_msg) print(server_addr) udp_client.close()