国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python面向對象之反射/自省機制實例分析

2020-01-04 14:39:47
字體:
來源:轉載
供稿:網友

本文實例講述了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 FtpClientf1 = FtpClient('198.1.1.1')#在編寫某個方法前,先判斷該方法是否存在,存在就可以直接調用,不存在就要編寫。if hasattr(f1,'get'):  func_get = getattr(f1,'get')  func_get()else  print('-----》不存在這個方法')  print('處理其他的邏輯')

 

希望本文所述對大家Python程序設計有所幫助。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 河东区| 临安市| 聂拉木县| 寿阳县| 云霄县| 阿巴嘎旗| 昌都县| 泰顺县| 微山县| 宁明县| 布尔津县| 长子县| 洛浦县| 广东省| 雷山县| 耒阳市| 呼玛县| 阿拉善左旗| 晋州市| 许昌县| 滕州市| 石嘴山市| 邵阳市| 敦煌市| 台东市| 瑞安市| 遂昌县| 永川市| 阿城市| 汉中市| 故城县| 辽中县| 赤城县| 闵行区| 邢台市| 白河县| 大港区| 天水市| 河曲县| 新晃| 略阳县|