Python學習day34-面向對象和網絡編程總結

 

Python學習day34-面向對象和網絡編程總結

面向對象及高階

類與對象

類:是一系列共同的屬性和方法java

對象:是屬性和方法的結合體node

屬性查找

包括數據屬性和方法.python

數據屬性:對象中找-->類中-->父類(按照__mro__查找,Python2中沒有mro列表)-->obj-->報錯 方法查找:對象的綁定方法-->類中-->父類(按照__mro__查找,Python2中沒有mro列表)-->obj-->報錯linux

綁定方法

定義在類內部的沒有被任何裝飾器裝飾的函數,就是方法 給對象用的,對象.方法(默認把自身做爲第一個參數傳過去) 類來調用,就是普通函數,有幾個值就傳幾個值web

對象之間的交互

把一個對象傳到另外一個對象中,從而操做這個對象編程

面向對象的三大特性

-繼承:
-在類名後的括號中寫要繼承的類,用逗號分隔
-python中支持多繼承,java只支持單繼承(屬性查找順序)
-新式類和經典類:
-繼承了object的類都叫新式類,Python3中都是新式類
-Python2中才有新式類和經典類的區別
-菱形問題的查找:
-廣度優先:新式類
-深度優先:經典類
-mro列表
-super() 特殊的對象,調用父類的方法和屬性,嚴格按照mro列表找的
-self和super的區別,self必定是從根部開始找,super()從當前位置按照mro列表找
-類名.方法() 指名道姓的調用類和方法,就是個普通函數
-派生:子類多出來的屬性和方法-多態和多態性:
-一個事物多種形態
-多態性:執行同一個事物的同一個方法,表現出來的結果是不同的
-兩種約束子類必須實現必定方法的方式
-abc模塊
-raise拋異常
-鴨子類型:走路像鴨子,叫聲像鴨子,你就是鴨子
-len()內部是調用了對象.len() -封裝:
-把屬性或方法隱藏起來
-以__開頭,就會隱藏
-但並無實際的隱藏,只是作了一個變形
-隱藏屬性,保證數據安全
-隱藏方法,隔離複雜度
-property 裝飾器,包裝方法成數據屬性 -其餘兩個裝飾器:
-classmethod,類的綁定方法,能夠類來調用,會自動把類自己傳入,對象也能夠調用
-staticmethod,靜態方法,均可以調用,不會自動傳參,就是普通函數windows

元類

__call__ -__new__ -__getattr__ -__setattr__ -__delattr__ -type和object安全

反射

(經過字符串去獲取,刪除,修改對象的屬性或方法) 網絡

-hasattr

-getattr

-setattr

-delattr

-isinstance 和 issubclass

網絡編程

網絡的概念

網絡最簡單的來講就是連接介質+協議.

五層網絡協議

  1. 物理層:01010101
  2. 數據鏈路層:作分組,數據報/數據幀,mac地址
  3. 網絡層:IP地址,經過IP獲得mac地址,用arp協議,用於mac地址的學習
  4. 運輸層:tcp/udp,三次握手,四次揮手,可靠傳輸
  5. 應用層:寫的程序都是應用層,基於socket寫的,或者是http協議,以及郵件協議

socket編寫tcp的客戶端和服務端

 
 
 
xxxxxxxxxx
1
30
 
 
 
 
1
# 服務端
2
import socket
3
#生成一個socket對象
4
soc=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
5
#綁定地址跟端口號
6
soc.bind(('127.0.0.1',8001))
7
#監聽(半鏈接池的大小),不是鏈接數
8
soc.listen(3)
9
#等着客戶端來鏈接,conn至關於鏈接通道,addr是客戶端的地址
10
while True:
11
    print('等待客戶端鏈接')
12
    conn,addr=soc.accept()    #卡主,若是沒有客戶端鏈接,會一直卡在這,當有鏈接,才繼續往下走
13
    print('有個客戶端鏈接上了',addr)
14
    while True:
15
        try:
16
            #windows若是客戶端斷開,會報錯,加了try
17
            #linux若是客戶端,斷開,不會報錯,會收到空,全部當data爲空時,也break
18
            #等待接收,最大收取1024個字節
19
            data=conn.recv(1024)    #會卡主,當客戶端有數據過來,纔會執行
20
            if len(data)==0:  #處理linux客戶端斷開,若是在window下這段代碼根本不會執行(即使是客服端發了空,這個地方也不會走到)
21
                break
22
            print(data)
23
        except Exception:
24
25
            break
26
    # 關閉通道
27
    conn.close()
28
29
30
# 關閉套接字
31
soc.close()
 
 
 
 
 
xxxxxxxxxx
1
18
 
 
1
# 客戶端
2
import socket
3
4
soc=socket.socket()
5
6
soc.connect(('127.0.0.1',8001))
7
while True:
8
    in_s=input('請輸入要發送的數據:')
9
    #發送的數據必須是b格式,in_s.encode('utf-8') 把字符串編碼成b格式
10
    #把b格式轉成字符串
11
    ss=str(b'hello',encoding='utf-8')
12
    ss=b'hello'.decode('utf-8')
13
    # #把字符串轉成b格式
14
    by=bytes('hello',encoding='utf-8')
 
 
15
    by='hello'.encode('utf-8')
16
17
18
    soc.send(in_s.encode('utf-8'))
19
 
 

 

socket編寫udp的客戶端和服務端

 
 
 
xxxxxxxxxx
1
14
 
 
 
 
1
import socket
2
3
# UDP客戶端
4
5
client = socket.socket(type=socket.SOCK_DGRAM)
6
7
# 直接發
8
while True:
9
msg = input('>>:')
10
client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8003))
11
12
data = client.recvfrom(1024)
13
print(data)
14
 
 
 
 
 
xxxxxxxxxx
1
17
 
 
 
 
1
import socket
2
3
# UDP服務端
4
5
server = socket.socket(type=socket.SOCK_DGRAM)
6
7
server.bind(('127.0.0.1', 8003))
8
9
# udp不須要創建鏈接,直接發送
10
# 不須要監聽,因此收發方式和tcp不同
11
# data = server.recvfrom(1024)
12
# data是個元組,第一個參數是接收到數據,第二個是客戶端的地址端口
13
while True:
14
data, addr = server.recvfrom(1024)
15
16
print(data)
17
server.sendto(data, addr)
 
 

 

tcp和udp的特色

TCP須要創建連接,且傳輸有保證,爲可靠連接.

UDP不須要創建連接,知道地址就能夠直接發送,且不須要監聽,因此收發方式比tcp更簡單,可是不可靠連接,由於互相沒法確認是否收到了數據.

相關文章
相關標籤/搜索