Python的OO思想

想當年大二的時候,在學校學習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
相關文章
相關標籤/搜索