程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python反射機制之hasattr()、getattr()、setattr() 、delattr()函數

編輯:Python

反射機制

先看看我對Java中反射機制的通俗理解:反射之中包含了一個“反”的概念,所以要想解釋反射就必須先從“正”開始解釋,一般而言,當用戶使用一個類的時候,應該先知道這個類,而後通過這個類產生實例化對象,但是“反”指的是通過對象找到類。

而對於Python,如果我們需要動態導入模塊,並且動態地訪問對象中的屬性和方法,怎麼做?請看下面的代碼。

s = "lib.test.commons"
m1 = __import__(s) # 這樣僅僅動態導入了lib模塊
m2 = __import__(s, fromlist = True) # fromlist = True,這樣才能按路徑動態導入commons模塊
inp_func = input("請輸入要執行的函數:")
f = getattr(m2, inp_func)() # 加"()"動態執行函數

由上述可見,反射就是:

  • 通過字符串的形式,動態導入模塊;
  • 利用字符串的形式,在對象(模塊)中操作(查找/獲取/刪除/添加)成員,是一種基於字符串的事件驅動!

反射機制內置函數

hasattr(obj,name)

判斷一個對象obj裡面是否有name屬性或者name方法,返回bool值,有name特性返回True, 否則返回False。

需要注意的是name要用引號包起來。

class test():
name="xiaohua"
def run(self):
return "HelloWord"
>>> t=test()
>>> hasattr(t, "name") #判斷對象有name屬性
True>>> hasattr(t, "run") #判斷對象有run方法
True

getattr(obj,name[,default])

獲取對象obj的屬性或者方法,如果存在就打印出來,如果不存在,則打印出默認值,默認值可選。
需要注意的是,如果是返回的對象的方法,返回的是方法的內存地址,如果需要運行這個方法,可以在後面添加一對括號。

''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群裡還有不錯的視頻學習教程和PDF電子書! '''
class test():
name="xiaohua"
def run(self):
return "HelloWord"
>>> t=test()
>>> getattr(t, "name") #獲取name屬性,存在就打印出來。
'xiaohua'
>>> getattr(t, "run") #獲取run方法,存在就打印出方法的內存地址。
<bound method test.run of <__main__.test instance at 0x0269C878>>
>>> getattr(t, "run")() #獲取run方法,後面加"()"可以將這個方法運行。
'HelloWord'
>>> getattr(t, "age") #獲取一個不存在的屬性。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: test instance has no attribute 'age'
>>> getattr(t, "age","18") #若屬性不存在,返回一個默認值。
'18'

setattr(obj,name,values)

給對象obj的屬性賦值,若屬性不存在,先創建再賦值。

class test():
name="xiaohua"
def run(self):
return "HelloWord"
>>> t=test()
>>> hasattr(t, "age") #判斷屬性是否存在
False
>>> setattr(t, "age", "18") #屬性不存在就創建之,且賦值,但沒有返回值
>>> hasattr(t, "age") #屬性存在了
True

delattr(obj,name)

刪除對象屬性。

另外,eval()和exec()函數也是反射函數。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved