中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python面向對象之反射機制怎么使用

發布時間:2021-08-21 14:24:31 來源:億速云 閱讀:141 作者:小新 欄目:開發技術

小編給大家分享一下Python面向對象之反射機制怎么使用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

反射:程序可以訪問,檢測和修改它本身狀態或行為的一種能力(自省)

下面就介紹四種實現自省的函數,適用于類和對象

1. 判斷object中有沒有一個name字符串對應的屬性或者方法

hasattr(object,name)

2. 獲取object中name字符串對應的屬性值或者方法地址,其中default參數的作用是,在找不到屬性的時候,給予調用者的提示信息。

getattr(object,name,default= None)

3. 將object中name字符串對應的屬性值設置為value,這個屬性可以是新增的屬性。

setattr(object,name,value)

4. 刪除object中name字符串對應的屬性。

delattr(object,name)

四個方法的演示

class BlackMedium:
  feture = 'Ugly'
  def __init__(self,name,addr):
    self.name = name
    self.addr = addr
  def 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'))
#獲取屬性
temp = getattr(b1,'name')
print(temp)
func = getattr(b1,'rent_house')
func()
#getattr(b1,'aaaaaa') 獲取不存在的屬性,就會報錯。
print(getattr(b1,'aaaaa','該屬性不存在'))
#設置數據屬性和方法屬性
setattr(b1,'sb',True)
setattr(b1,'show_name',lambda self:self.name + 'sb')
print(b1.__dict__)
print(b1.show_name(b1))
#刪除屬性
delattr(b1,'addr')
delattr(b1,'show_name')
#刪除不存在的屬性,報錯
delattr(b1,'show_name123')
print(b1.__dict__)

運行結果:

True
True
萬成置地
萬成置地租房子
該屬性不存在
{'sb': True, 'show_name': <function <lambda> at 0x01BCA7F0>, 'name': '\xe4\xb8\x87\xe6\x88\x90\xe7\xbd\xae\xe5\x9c\xb0', 'addr': '\xe5\xa4\xa9\xe9\x9c\xb2\xe5\x9b\xad'}
萬成置地sb
Traceback (most recent call last):
  File "C:\py\jb51PyDemo\src\Demo\test.py", line 37, in <module>
    delattr(b1,'show_name123')
AttributeError: BlackMedium instance has no attribute 'show_name123'

為什么用反射呢?

舉例:兩個程序員A,B,A在寫程序用到B寫的類,但是B還沒有完成這個類的編寫。此時就可以用到反射,完成A自己想要編寫的代碼。并且不影響B的后期編碼。

好處:可以事先定義好接口,接口只有在被完成時,才會真正執行,實現了即插即用,也就是一種后期綁定,即先定義接口,后期在實現接口的功能。

B還沒有實現的全部功能

class FtpClient:
   #ftp客戶端,但是還沒有實現功能
   def __init__(self,addr):
     print('正在連接服務器[%s]'%(self.addr))
     self.addr = addr

A后期的代碼編寫

from module import FtpClient
f1 = FtpClient('198.1.1.1')
#在編寫某個方法前,先判斷該方法是否存在,存在就可以直接調用,不存在就要編寫。
if hasattr(f1,'get'):
  func_get = getattr(f1,'get')
  func_get()
else
  print('-----》不存在這個方法')
  print('處理其他的邏輯')

以上是“Python面向對象之反射機制怎么使用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

锦屏县| 阜城县| 河北区| 栖霞市| 息烽县| 宜宾县| 昭觉县| 东平县| 朝阳区| 阆中市| 东港市| 祥云县| 遵化市| 高要市| 沙田区| 满洲里市| 临城县| 龙口市| 高唐县| 潢川县| 佛坪县| 平安县| 久治县| 扬中市| 杭锦旗| 吕梁市| 介休市| 正安县| 平江县| 朝阳县| 客服| 开阳县| 池州市| 汽车| 信宜市| 茂名市| 兴和县| 广州市| 阜平县| 金溪县| 亚东县|