反射是python的一個高級特性,利用反射我們可以做很多事情。之前對反射的理解有些偏頗,這裏再梳理下自己的想法,後續有了更多的想法,繼續介紹。
以python爲例子介紹:
反射:Reflection is an API which is used to examine or modify the behavior of methods, classes, interfaces at runtime.
java裏面比較多,之前一篇博文也嘗試介紹了下java的,當時對java的反射很感興趣,不過純粹是記流水賬,沒有自己的很uo的理解。https://blog.csdn.net/wangqing008/article/details/77921930
說白了,反射是一種機制,允許我們去動態的檢測,修改類的方法屬性。舉個例子,比如一個person類,他有一個方法是eat,如果我想把某個人的這個eat方法修改成只能喫某個東西,或者給person增加一個技能,比如他會編程了。而且是動態的去該改變,這個時候反射就有用處了。
支持python反射的幾個api在這個文章中有詳細介紹,
https://zh.wikibooks.org/zh-hk/Python/%E5%8F%8D%E5%B0%84
這裏列舉一下:
type(), isinstance(), issubclass(), callable(), dir(), getattr(),setattr(), delattr(),
永遠記住一句話,python裏面的任何東西都是對象,
type:type是可以獲取,或者說檢測類的屬性的,另外type可以接受一個類的描述作爲參數,然後返回一個類(這個準備在另外一篇文章好好闡述下,之前有一篇文章寫的非常好https://stackoverflow.com/questions/100003/what-are-metaclasses-in-python,https://www.cnblogs.com/JetpropelledSnake/p/9094103.html)。
isinstance():判斷對象是否來自一直類型,比如判斷一個對象是否是某一個類型,
type和isinstance的區別是,type不考慮繼承,isinstance考慮繼承,比如B是A的子類,那A創建的對象和B創建的對象instance A都是True的,但是type就不考慮這個,B創建的對象並不是A類型。
issubclass():類和類之間的關係,不是對象了,比如上面說的A和B的關係
dir():獲取對象的所有屬性,包括內嵌屬性
callable():判斷是否可以調用,既然說了python裏面的任何東西都是對象,那對象如果有一個__call__則這個是可以調用的,可以理解爲一個函數。
上面着5個完成的是對類的一個檢測識別,說白了就是判斷。比如判斷某個對象的類型,判斷某個類的父類子類,這些是可以根據這些判斷結果,從而動態去做某些事情的。當然這些還不夠,那就是接下來的attr的幾個兄弟。
getattr(),setattr(), delattr()
def drink(self):
print self.name + " is drinking"
class Person(object):
def __init__(self):
self.name = u"張三"
pass
def eat(self):
print self.name + " is eating"
zhangsan = Person()
method = getattr(zhangsan, "eat")
method()
setattr(zhangsan, "drink", drink)
zhangsan.drink(zhangsan) # 這裏暫時還沒理解,等理解了再補充
setattr(zhangsan, "sex", "man")
print zhangsan.sex
delattr(zhangsan, "drink")
method = getattr(zhangsan, "drink", None)
print method
通過這三個兄弟,去動態的獲取,設置,刪除對象的屬性或方法就比較簡單了。