想當(dāng)年大二的時(shí)候,在學(xué)校學(xué)習(xí)java,
最牛逼的OO思想,用了3頁(yè)紙就講完了,還是清華大學(xué)出版社的呢。
后來(lái)全憑自己啃視頻,啃代碼才搞懂什么叫做OO。
 
現(xiàn)在學(xué)習(xí)Python,就用自己的方式,好好學(xué)習(xí)一次:
OO的基本,是封裝,繼承,多態(tài)。
 
首先是繼承:
定義一個(gè)類(lèi):
- class Bird(object):  
 -     have_feather = True  
 -     way_of_rePRoduction  = 'egg'  
 
 
調(diào)用這個(gè)類(lèi):
- summer = Bird()  
 - print summer.way_of_reproduction  
 
與Java不同是,Python是不需要new來(lái)實(shí)例化類(lèi)的。
 
同樣,Python的類(lèi)下面是可以定方法的:
- class Bird(object):      
 -     have_feather = True      
 -     way_of_reproduction = 'egg'      
 -       
 -     def say(self, Word='hi hi'):  
 -               print 'i say :' + word  
 
 
注意一點(diǎn),所有類(lèi)的函數(shù),必須至少帶有一個(gè)參數(shù),這個(gè)參數(shù)必須是self。
類(lèi)以外的函數(shù)沒(méi)有這一個(gè)限制。
- chk = Chicken()  
 - print chk.have_feather  
 - print chk.sat('hello')  
 
 
__init__()方法
__init__()是一個(gè)特殊方法(special method)。Python里會(huì)有一些特殊方法,Python會(huì)以特別的方式處理它們。特殊方法的名字的特點(diǎn)是前后都有兩個(gè)下劃線(xiàn)。
__init__()方法的特殊在于,如果你在類(lèi)中定義了這個(gè)方法,一旦你根據(jù)這個(gè)類(lèi)建立對(duì)象,Python就會(huì)自動(dòng)調(diào)用這個(gè)方法(這個(gè)過(guò)程也叫初始化)。
如:
- class happyBird(Bird):  
 -     def __init__(self,more_words):  
 -         print 'We are happy birds.',more_words  
 -   
 - hb = happyBird('Happy,Happy!')  
 
 
父類(lèi)方法的重載:
- class Hello(object):  
 -     name = 'hello'  
 -       
 -     def __init__(self):  
 -         self.name='my name is hello'  
 -       
 -     
 -     def sayhi(self):  
 -         print 'hi you'  
 -   
 - class World(Hello):   
 -     def __init__(self):  
 -         
 -         print 'before:',Hello.name   
 -         super(World,self).__init__()    
 -         
 -         print 'after:',self.name  
 -           
 -         
 -     def sayhi(self,word='baby'):  
 -         
 -         super(World,self).sayhi()  
 -         print 'hi '+word  
 -               
 -     def sayWorld(self):  
 -         print 'hi,hello world'  
 -           
 - if __name__ == '__main__':  
 -     c = World()  
 -     c.sayhi()  
 -     c.sayWorld()  
 
 
 另外,python是允許多繼承的,但是這個(gè)是個(gè)非常危險(xiǎn)的操作,建議不要隨便使用。 
 
關(guān)于Python的多態(tài),就像JavaScript一樣,直接訪(fǎng)問(wèn)對(duì)象的屬性,不需要使用接口,沒(méi)有類(lèi)型轉(zhuǎn)換。
對(duì)于類(lèi)型的判斷,有抓們的type()函數(shù),和isinstance()函數(shù)判斷是否某個(gè)函數(shù)的子類(lèi)。
- isinstance(object, classinfo)   
 - 判斷實(shí)例是否是這個(gè)類(lèi)或者object是變量  
 -   
 - classinfo 是類(lèi)型(tuple,dict,int,float)  
 - 判斷變量是否是這個(gè)類(lèi)型   
 -   
 - class objA:   
 - pass   
 -   
 - A = objA()   
 - B = 'a','v'   
 - C = 'a string'   
 -   
 - print isinstance(A, objA)   
 - print isinstance(B, tuple)   
 - print isinstance(C, basestring)   
 - 輸出結(jié)果:   
 - True   
 - True   
 - True