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)
獲取第一個表頭,和其餘的表尾進行比較(每拿走一個都要回到第一個表頭從新開始)
不存在則拿走
存在,則放棄,而後獲取第二個表的表頭 ,再和其餘表的表尾進行比較
經典類:
廣度優先:python
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都是字符串