文章目錄
- 面向對象設計
- 類與對象的概念
- 1、類與對象的本質
- 2、面向對象設計 到 面向對象程式設計
- 3、類執行個體化
- 4、例如一個學校類
- 面向對象程式設計
- 1、案例
- 2、面向對象語言和面向對象程式設計之間的關系
- 3、類的屬性
- 4、類的其他一些屬性
- 5、類中的作用域
- 6、執行個體化相關(查、增、改、删)
Python是一門面向對象設計的程式設計語言,是以Python裡面提供了非常專業的面向對象用法。本篇就來總結一下面向對象相關的知識,從面向對象設計,到面向對象程式設計,再到Python中獨有的類與對象
面向對象設計
先來看一個面向對象設計的例子(裡面沒有用到類與對象):
def wushi(name,age,wutype):
#武士的動作
def sword(sw):
print('{}正在釋放{}'.format(sw['one_sword'],sw['three_sword'])) #取鍵對應的值
def teji(tj):
print('{}釋放{}大招'.format(tj['one_sword'],tj['three_teji']))
#武士的屬性
def init(name,age,wutype): #定義一個函數來專門裝存武士屬性的字典
#一個定義屬性的字典
zhaoshi = {
'one_sword':name, #字典的值為形參變量
'two_sword':age,
'three_sword':wutype,
'one_teji':'大振撼',
'three_teji':'三千世界',
#字典的值可以是一個函數名,這樣就将武士的動作和屬性綁定起來了
#鍵'sword'和'teji'就是屬性,值sword和teji就是動作(函數)
'sword':sword,
'teji':teji,
}
return zhaoshi #傳回一個字典
res = init(name,age,wutype)
return res
ret1 = wushi('索隆','22','三刀流') #運作函數,将傳回值指派給ret
ret1['sword'](ret1)
#找到字典鍵['sword']對應的值,因為是個函數,可以用()直接運作
#傳入的是一個字典,是以在sword函數中可以用鍵取值
ret2 = wushi('路飛','19','無刀流')
ret2['teji'](ret2)
#這樣就可以生成多個武士(wushi函數),并且給他們傳入不同的屬性
運作結果:
類與對象的概念
1、類與對象的本質
一個對象就是動作跟屬性的結合;
一個類就是承載同種類事物的動作和屬性的一個容器;
因為這容器有特定的屬性和動作,就相當于一個模型。
2、面向對象設計 到 面向對象程式設計
在上文的代碼中,wushi(武士)就是一個類,sword和teji函數就是類中定義的動作,zhaoshi就是類中定義的屬性;
而ret1和ret2就兩個對象,這兩個對象擁有了類中的動作和屬性
3、類執行個體化
由類産生一個對象就是類執行個體化,這個對象具備類中的屬性和動作,一個類可以産生任意個對象
4、例如一個學校類
屬性: name, address, type
動作: 考試, 招生, 開除學生
每一所學校則就是一個個對象;由這個學校類産生多個學校就類執行個體化
面向對象程式設計
1、案例
#建立一個wushi類
class wushi: #類可以不要參數
#定義屬性
def __init__(self,name,age,wutype): #相當于存放屬性的一個函數,self參數是必要參數
self.name = name #将self的name用傳入的形參name來指派,就相對于面向對象設計中的字典給鍵指派
self.age = age
self.wutype = wutype
#定義動作
def sword(self): #傳入的參數為self這個屬性,将動作與屬性結合起來
print('{}歲的{}正在釋放{}'.format(self.age, self.name, self.wutype))
#用self.來使用屬性變量,類似字典中的sw['age'],sw['name'],sw['wutype']
def teji(self):
print('{}歲的{}釋放大招{}'.format(self.age, self.name, self.wutype))
#建立對象,即類執行個體化,每一個對象都調用了wushi這個類
wushi_one = wushi('路飛','19','無刀流')
wushi_two = wushi('索隆','22','三刀流')
wushi_three = wushi('鷹眼','32','大寶劍')
#調用對象,即使用對象中的屬性和動作
wushi_one.sword()
wushi_two.teji()
wushi_three.teji()
運作結果:
2、面向對象語言和面向對象程式設計之間的關系
Python是一門面向對象設計的程式設計語言,但面向對象程式設計并不是每個程式都必須的,如果用普通的函數堆疊就能實作功能也可以不用class類和__init__的方法。
隻是在程式比較大的時候,用面向對象程式設計可以使程式更簡單。
還有一個概念,用面向對象語言寫程式、程式的設計是面向對象的是兩碼事。
比如第一段代碼裡面,它是面向對象設計,但在非面向對象語言裡這樣寫代碼,那也可以叫做程式的設計是面向對象的
3、類的屬性
資料屬性: 就是變量
函數屬性: 就是函數,但在面向對象裡面稱作方法
#建立一個wushi類
class wushi:
#定義屬性
vv = '海賊王' #定義一個資料屬性
def killer(self):
print(self)
return 'killer 的傳回值'
print(wushi.vv) #調用資料屬性
print(wushi.killer('三千世界')) #調用函數屬性
print(dir(wushi)) #檢視類的所有屬性名
print(wushi.__dict__) #檢視類屬性字典,包括屬性名和屬性
print(wushi.__dict__['vv']) #用鍵值對取資料屬性
print(wushi.__dict__['killer']('三千世界')) #用鍵值對取函數屬性
運作結果:
4、類的其他一些屬性
#建立一個wushi類
class wushi:
'這是一個武士的類' #相當于一個類的描述
#定義屬性
vv = '海賊王' #定義一個資料屬性
def killer(self):
print(self)
return 'killer 的傳回值'
print(wushi.__name__) #輸出類的名稱
print(wushi.__doc__) #輸出類的描述
print(wushi.__base__) #類的類型,都為<class 'object'>
print(wushi.__module__) #檢視類所在的子產品
運作結果:
5、類中的作用域
在類定義的變量是屬性,可以調用,全局變量則不能當做屬性來調用
name = 'Kevie'
#建立一個類
class wushi:
age = 18
print('this is from 類%s' %name)
v = wushi()
print(v.age)
#print(v.name) #name是全局變量
#建立一個函數
def wushi_2():
age = 18
print('this is from 函數%s' %name)
wushi_2()
運作結果:
6、執行個體化相關(查、增、改、删)
執行個體由類産生,類有資料屬性和函數屬性;但執行個體(對象)隻有資料屬性,沒有函數屬性;隻是通過資料屬性來通路函數屬性;是以每個函數都需要傳入self屬性作為參數
class wushi:
def __init__(self,name,age):
self.name = name
self.age = age
def bark(self,greet):
print('%s ! %s am %s' %(greet,self.name,self.age))
v = wushi('索隆','22') #執行個體化一個類,生成對象(執行個體)v
print(v.age) #用執行個體來調用資料屬性
v.bark('Hello') #通過資料屬性self來通路bark函數屬性,同時再傳入一個參數
#修改執行個體(對象)的屬性
v.name = '路飛'
v.bark('Hello')
#增加類屬性
wushi.wutype = '三千世界1'
print(wushi.wutype)
#增加對象(執行個體)屬性
v.wutype = '三千世界2'
print(wushi.wutype)
#增加一個動作(類與執行個體方法相同)
def play_game():
print('this is from play_game')
v.play_game = play_game
v.play_game()
#删除類屬性(執行個體屬性方法同)
del wushi.wutype
print(wushi.__dict__) #檢視所有屬性,就不存在wutype了
運作結果: