日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python教程:封装、多态、反射

發布時間:2025/3/20 python 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python教程:封装、多态、反射 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、封裝

1.1封裝的定義

在程序設計中,封裝是對具體對象的一種抽象,即將某些部分隱藏起來,在程序外部看不到,其含義是其他程序無法調用。

要了解封裝,離不開“私有化”,就是將類或者是函數中的某些屬性限制在某個區域之內,外部無法調用。

1.2封裝的用處

封裝數據的主要原因是:保護隱私(把不想別人知道的東西封裝起來)

封裝方法的主要原因是:隔離復雜度

注意:在編程語言里,對外提供的接口(接口可理解為了一個入口),就是函數,稱為接口函數,這與接口的概念還不一樣,接口代表一組接口函數的集合體。

1.3封裝的兩個層面

(1)類就是麻袋,這本身就是一種封裝

(2)類中定義私有的,只有類的內部使用,外部無法訪問

class People:_star='earth' #單下劃線表示被隱藏起來def __init__(self,name,id,age,salary):self.name=nameself.id=idself.age=ageself.salary=salarydef get_id(self):print('[%s的身份證號是%s]'%(self.name,self.id))p1=People('czd','62012393208',18,100000) print(p1._star)class People:__star='earth' #雙下劃綫def __init__(self,name,id,age,salary):self.name=nameself.id=idself.age=ageself.salary=salarydef get_id(self):print('[%s的身份證號是%s]'%(self.name,self.id))p1=People('czd','62012393208',18,100000) # print(p1.__star) #報錯print(p1._People__star)

這種自動變形的特點:

1、類中定義的__star只能在內部使用,如品p1.__star,引用的就是變形的結果。

2、這種變形其實正是針對外部的變形,在外部是無法通過__star這個名字訪問到的。

3、在子類定義的__star不會覆蓋在父類定義的__star,因為子類中變形成了:_子類名__star,而父類中變形成了:_父

類名__star,即雙下滑線開頭的屬性在繼承給子類時,子類是無法覆蓋的。

注意:對于這一層面的封裝(隱藏),我們需要在類中定義一個函數(接口函數)在它內部訪問被隱藏的屬性,然后

外部就可以使用了

二、多態

2.1多態的概念

多態的特性是調用不同的子類將會產生不同的行為,而無需明確知道這個子類實際上是什么。

多態實際上是依附于繼承的兩種含義:"改變"和"擴展"本身就意味著必須有機制去選用你改變/擴展過的版本,多態實質上就是繼承的實現細節;

子類實例化后調用基類的方法,w1.turn_ice()叫做多態;

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class H2O:def __init__(self,name,temperature):self.name=nameself.temperature=temperaturedef turn_ice(self):if self.temperature<0:print('[%s]溫度太低結冰了'%self.name)elif self.temperature>0 and self.temperature<100:print('[%s]液化成水'%self.name)elif self.temperature>100:print('[%s]溫度太高變為水蒸氣'%self.name)class Water(H2O):pass class Ice(H2O):pass class Steam(H2O):passw1=Water('水',25)i1=Ice('冰',-20)s1=Steam('蒸汽',200)# w1.turn_ice() #執行過程中不同的對象調用相同的方法 # i1.turn_ice() # s1.turn_ice()#或者定義一個接口來執行上面的調用 def func(obj):obj.turn_ice()func(w1) #---->w1.turn_ice() func(i1) func(s1)

三、反射

3.1反射的介紹

反射說簡單點 --> 就是利用字符串的形式去對象(模塊)中操作(尋找/檢查/設置/刪除)成員。

  • hasattr(object,“name”)
  • getattr(object,“name”,default=None)
  • setattr(x,y,v)
  • delattr(x,y)

例如:

class BlackMedium:feture = 'Ugly'def __init__(self,name,addr):self.name=nameself.addr=addrdef sell_house(self):print('[%s]正在賣房子,傻逼才買呢'%self.name)def rent_house(self):print('[%s]正在租房子,傻逼才租呢'%self.name)b1=BlackMedium('萬成置地','天露園')print(hasattr(b1,'name')) print(hasattr(b1,'sell_house')) #顯示True print(hasattr(b1,"sell_houseaaa"))#顯示Falseprint(getattr(b1,'name')) print(getattr(b1,'rent_house')) func=getattr(b1,'rent_house') func() # print(getattr(b1,'rent_houseaaa')) #沒有則報錯 print(getattr(b1,'rent_houseaaa','沒有這個屬性'))#數據屬性 setattr(b1,'sb','True') #相當于b1.sb=True setattr(b1,'123','czd') setattr(b1,'name','fuzhou') #函數屬性 setattr(b1,'func',lambda x:x+1) setattr(b1,'func1',lambda self:self.name+'sb') print(b1.__dict__) print(b1.func) print(b1.func(1)) print(b1.func1(b1))delattr(b1,'sb') #相當于del b1.sb print(b1.__dict__)

3.2 反射的好處

(1)好處一:實現可插拔機制

有倆程序員,一個czd,一個是egon,lili在寫程序的時候需要用到egon所寫的類,但是egon去跟女朋友度蜜月去了,還沒有完成他寫的類,lili想到了反射,使用了反射機制czd可以繼續完成自己的代碼,等egon度蜜月回來后再繼續完成類的定義并且去實現czd想要的功能。

總之反射的好處就是,可以事先定義好接口,接口只有在被完成后才會真正執行,這實現了即插即用,這其實是一種‘后期綁定’,什么意思?即你可以事先把主要的邏輯寫好(只定義接口),然后后期再去實現接口的功能

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class FtpClient:'ftp客戶端,但是還么有實現具體的功能'def __init__(self,addr):print('正在連接服務器[%s]' %addr)self.addr=addr

導入模塊

#from module import FtpClient f1=FtpClient('192.168.1.1') if hasattr(f1,'get'):func_get=getattr(f1,'get')func_get() else:print('---->不存在此方法')print('處理其他的邏輯')

(2)好處二:動態導入模塊(基于反射當前模塊成員)

總結

以上是生活随笔為你收集整理的python教程:封装、多态、反射的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。