Python學習day34-面向對象和網絡編程總結面向對象及高階類與對象屬性查找綁定方法對象之間的交互面向對象的三大特性元類反射網絡編程網絡的概念五層網絡協議socket編寫tcp的客戶端和服務端socket編寫udp的客戶端和服務端tcp和udp的特色html
類:是一系列共同的屬性和方法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
網絡最簡單的來講就是連接介質+協議.
xxxxxxxxxx
# 服務端
import socket
#生成一個socket對象
soc=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#綁定地址跟端口號
soc.bind(('127.0.0.1',8001))
#監聽(半鏈接池的大小),不是鏈接數
soc.listen(3)
#等着客戶端來鏈接,conn至關於鏈接通道,addr是客戶端的地址
while True:
print('等待客戶端鏈接')
conn,addr=soc.accept() #卡主,若是沒有客戶端鏈接,會一直卡在這,當有鏈接,才繼續往下走
print('有個客戶端鏈接上了',addr)
while True:
try:
#windows若是客戶端斷開,會報錯,加了try
#linux若是客戶端,斷開,不會報錯,會收到空,全部當data爲空時,也break
#等待接收,最大收取1024個字節
data=conn.recv(1024) #會卡主,當客戶端有數據過來,纔會執行
if len(data)==0: #處理linux客戶端斷開,若是在window下這段代碼根本不會執行(即使是客服端發了空,這個地方也不會走到)
break
print(data)
except Exception:
break
# 關閉通道
conn.close()
# 關閉套接字
soc.close()
xxxxxxxxxx
# 客戶端
import socket
soc=socket.socket()
soc.connect(('127.0.0.1',8001))
while True:
in_s=input('請輸入要發送的數據:')
#發送的數據必須是b格式,in_s.encode('utf-8') 把字符串編碼成b格式
#把b格式轉成字符串
ss=str(b'hello',encoding='utf-8')
ss=b'hello'.decode('utf-8')
# #把字符串轉成b格式
by=bytes('hello',encoding='utf-8')
by='hello'.encode('utf-8')
soc.send(in_s.encode('utf-8'))
xxxxxxxxxx
import socket
# UDP客戶端
client = socket.socket(type=socket.SOCK_DGRAM)
# 直接發
while True:
msg = input('>>:')
client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8003))
data = client.recvfrom(1024)
print(data)
xxxxxxxxxx
import socket
# UDP服務端
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8003))
# udp不須要創建鏈接,直接發送
# 不須要監聽,因此收發方式和tcp不同
# data = server.recvfrom(1024)
# data是個元組,第一個參數是接收到數據,第二個是客戶端的地址端口
while True:
data, addr = server.recvfrom(1024)
print(data)
server.sendto(data, addr)
TCP須要創建連接,且傳輸有保證,爲可靠連接.
UDP不須要創建連接,知道地址就能夠直接發送,且不須要監聽,因此收發方式比tcp更簡單,可是不可靠連接,由於互相沒法確認是否收到了數據.