天天看點

初學者python筆記(面向對象程式設計、類與對象)

文章目錄

  • ​​面向對象設計​​
  • ​​類與對象的概念​​
  • ​​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函數),并且給他們傳入不同的屬性      

運作結果:

初學者python筆記(面向對象程式設計、類與對象)

類與對象的概念

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()      

運作結果:

初學者python筆記(面向對象程式設計、類與對象)
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']('三千世界'))  #用鍵值對取函數屬性      

運作結果:

初學者python筆記(面向對象程式設計、類與對象)
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__)  #檢視類所在的子產品      

運作結果:

初學者python筆記(面向對象程式設計、類與對象)
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()      

運作結果:

初學者python筆記(面向對象程式設計、類與對象)
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了      

運作結果:

初學者python筆記(面向對象程式設計、類與對象)