1. 程式人生 > >面向對象進階(day7)

面向對象進階(day7)

計算機 code 成績 就是 函數 但是 lam one 證明

一、isinstance(obj,cls)和issubclass(sub,super) 1、isinstance(obj,cls)檢查是否obj是否是類 cls 的對象 class Foo(object): pass obj = Foo() isinstance(obj, Foo) 2、issubclass(sub, super)檢查sub類是否是 super 類的派生類 class Foo(object): pass class Bar(Foo): pass issubclass(Bar, Foo) 二、反射 1、什麽是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力(自省)。這一概念的提出很快引發了計算機科學領域關於應用反射性的研究。它首先被程序語言的設計領域所采用,並在Lisp和面向對象方面取得了成績。 2、python面向對象中的反射 1)通過字符串的形式操作對象相關的屬性。python中的一切事物都是對象(都可以使用反射) 四個可以實現自省的函數(下列方法適用於類和對象(一切皆對象,類本身也是一個對象)) (1)hasattr(object,name) 判斷object中有沒有一個name字符串對應的方法或屬性 (2)getattr(object, name, default=None) 獲取object中的屬性 (3)setattr(x, y, v) 設置object中的屬性 (4)delattr(x, y) 刪除object中的屬性 2)四個方法的使用演示 class BlackMedium: feature=‘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‘)) #獲取屬性 n=getattr(b1,‘name‘) print(n) func=getattr(b1,‘rent_house‘) func() # getattr(b1,‘aaaaaaaa‘) #報錯 print(getattr(b1,‘aaaaaaaa‘,‘不存在啊‘)) #設置屬性 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_name111‘) #不存在,則報錯 print(b1.__dict__) 3)類也是對象 class Foo(object): staticField = "old boy" def __init__(self): self.name = ‘wupeiqi‘ def func(self): return ‘func‘ @staticmethod def bar(): return ‘bar‘ print getattr(Foo, ‘staticField‘) print getattr(Foo, ‘func‘) print getattr(Foo, ‘bar‘) 4)反射當前模塊成員 import sys def s1(): print ‘s1‘ def s2(): print ‘s2‘ this_module = sys.modules[__name__] hasattr(this_module, ‘s1‘) getattr(this_module, ‘s2‘) 3、為什麽用反射之反射的好處 好處一:實現可插拔機制 有倆程序員,一個lili,一個是egon,lili在寫程序的時候需要用到egon所寫的類,但是egon去跟女朋友度蜜月去了,還沒有完成他寫的類,lili想到了反射,使用了反射機制lili可以繼續完成自己的代碼,等egon度蜜月回來後再繼續完成類的定義並且去實現lili想要的功能。 總之反射的好處就是,可以事先定義好接口,接口只有在被完成後才會真正執行,這實現了即插即用,這其實是一種‘後期綁定’,什麽意思?即你可以事先把主要的邏輯寫好(只定義接口),然後後期再去實現接口的功能 好處二:動態導入模塊(基於反射當前模塊成員)

面向對象進階(day7)