想當年大二的時候,在學校學習Java,python
最牛逼的OO思想,用了3頁紙就講完了,仍是清華大學出版社的呢。app
後來全憑本身啃視頻,啃代碼才搞懂什麼叫作OO。函數
如今學習Python,就用本身的方式,好好學習一次:學習
OO的基本,是封裝,繼承,多態。spa
首先是繼承:code
定義一個類:視頻
class Bird(object): have_feather = True way_of_reproduction = 'egg'
調用這個類:對象
summer = Bird() print summer.way_of_reproduction
與Java不一樣是,Python是不須要new來實例化類的。blog
一樣,Python的類下面是能夠定方法的:繼承
class Bird(object): have_feather = True way_of_reproduction = 'egg' def say(self, word='hi hi'): print 'i say :' + word
注意一點,全部類的函數,必須至少帶有一個參數,這個參數必須是self。
類之外的函數沒有這一個限制。
chk = Chicken() print chk.have_feather print chk.sat('hello')
__init__()方法
__init__()是一個特殊方法(special method)。Python裏會有一些特殊方法,Python會以特別的方式處理它們。特殊方法的名字的特色是先後都有兩個下劃線。
__init__()方法的特殊在於,若是你在類中定義了這個方法,一旦你根據這個類創建對象,Python就會自動調用這個方法(這個過程也叫初始化)。
如:
class happyBird(Bird): def __init__(self,more_words): print 'We are happy birds.',more_words hb = happyBird('Happy,Happy!')
父類方法的重載:
class Hello(object): name = 'hello' def __init__(self): self.name='my name is hello' #類中的參數必須帶有self參數 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'): #調用父類sayhi方法 super(World,self).sayhi() print 'hi '+word def sayWorld(self): print 'hi,hello world' if __name__ == '__main__': c = World() c.sayhi() c.sayWorld()
另外,python是容許多繼承的,可是這個是個很是危險的操做,建議不要隨便使用。
關於Python的多態,就像JavaScript同樣,直接訪問對象的屬性,不須要使用接口,沒有類型轉換。
對於類型的判斷,有抓們的type()函數,和isinstance()函數判斷是否某個函數的子類。
isinstance(object, classinfo) 判斷實例是不是這個類或者object是變量 classinfo 是類型(tuple,dict,int,float) 判斷變量是不是這個類型 class objA: pass A = objA() B = 'a','v' C = 'a string' print isinstance(A, objA) print isinstance(B, tuple) print isinstance(C, basestring) 輸出結果: True True True