python反射自我總結

反射是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-pythonhttps://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

通過這三個兄弟,去動態的獲取,設置,刪除對象的屬性或方法就比較簡單了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章