Python 面向对象(二)
Python 的面向對象和其他語言不一樣,python的class術語與c++有一定區別,與 Modula-3更像。
1 設計面向對象
設計分成下面的兩個方面,一定要先設計,找好對象,找類
1 面向對象程序設計 OOD
- 找對象-->找類(歸納對象共同的特征和技能,每個對象獨有的特征)
2面向對象程序編程OOP
- 先定義類--實例化對象
1.1 面向對象的作用
可擴展性性強,增加屬性,但是導致了可控性差。
1.2 什么是對象,什么是類
python中一切皆為對象,且python3統一了類與類型的概念,類型就是類。如dict
用面向對象設計一個游戲,每個玩家所有一個英雄,每個英雄都有自己的特征和技能,特征和技能的結合體就是一個對象。
從一組對象中提取相似的部分就是類,類是所有對象的都具有的特征和技能的結合體。
python 中用變量表示特征,用函數表示技能,所以類是變量和函數的結合體,對象是變量與方法(指向類的函數)的結合體
2 初識類
class Data:passPython3中的都是新式類,新式類必須繼承至少一個父類
2.1 類的使用
屬性引用和實例化
1 屬性引用(類名.屬性)
class Student:county = 'China' # 共有的特征def __init__(self,ID,NAME,SEX,PROVINCE): # 一個人獨有的特征self.id = IDself.name = NAMEself.sex = SEXself.province = PROVINCEdef search_score(self):print("tell score")def study(self):print('study',self)```python
Student.county #引用類的數據屬性,該屬性與所有對象/實例共享
2 **實例化(__init__與self)**
類名加括號就是實例化,會自動觸發__init__函數的運行,可以用它來為每個實例定制自己的特征
>>>s1 = Student('121231','aaa','female','beijing') # 默認的selfself的作用是在實例化時自動將對象/實例本身傳給__init__的第一個參數
實例化后就能夠通過s1.的方式進行調用
2.2 對象 (實例)
對象是關于類而實際存在的一個例子,即實例。
print(isinstance(s1,Student)) # s1 是Student的實例2.2.1對象(實例)只有一種作用,就是屬性引用
對象和實例本身只有數據屬性
print(s1.id) print(s1.nickname)2.2.2綁定方法
對象(實例)本身只有數據屬性,但是Python的class機制會把類的函數綁定到對象上,叫做對象的方法,或者綁定方法,
綁定方法唯一綁定一個對象,同一個類的方法綁定到不同的對象上,屬于不同的方法,內存地址不一樣。
bound method Student.search_score of <main.Student object at 0x00000000028F46A0
print(Student.search_score) # 對象的綁定方法search_score實際是類的函數的功能,兩者是一種綁定關系function Student.search_score at 0x00000000028EBBF8
對象的綁定方法的特別之處在于:obj.func()會把obj傳給func的第一個參數。
就是把s1傳遞給了Stdent類
綁定方法是唯一綁定到一個對象身上,不是共享的
2.2.3 對象之間的交互
class Riven:camp = 'Noxus'def __init__(self,nickname,agressiviry=54,life_value=114):self.nick = nicknameself.agre= agressiviryself.life_value = life_valuedef attack(self,enemy):print("%s is attack %s" %(self.nick,enemy))enemy.life_value -=self.agre# 根據自己的攻擊力,攻擊敵人,敵人的生命值就會減少class Garen:camp = 'Noxus'def __init__(self,nickname,agressiviry=54,life_value=114):self.nick = nicknameself.agre = agressiviryself.life_value = life_valuedef attack(self,enemy):print("%s is attack %s" %(self.nick,enemy))enemy.life_value -=self.agre # 根據自己的攻擊力,攻擊敵人,敵人的生命值就會減少#實例化一個Riven r1 = Riven("aaa") # 實例化一個Riven g1 = Garen("bbb") # 實例化一個Garen # print(g1.life_value) # # print(g1.nickname) # print(g1.agressivity) g1.attack(r1) # 交互式攻擊 g1攻擊g2 print(r1.life_value) # 好看敵人的生命值已經減少2.3 類的名稱空間與對象(實例)的名稱空間
類的名稱空間
創建一個類的名稱空間,用來存儲類的中定義的名字,這些名字稱為類的屬性。
類有兩種屬性:數據屬性和函數屬性
類的數據屬性是共享給所有對象的
print(id(r1.camp)) #本質就是在引用類的camp屬性,二者id一樣 print(id(Garen.camp))結果:
43227208
43227208
而類的屬性是綁定到所有的對象
print(id(r1.attack)) print(id(Riven.attack))結果:
34910088
36486272
r1.attack就是在執行Riven.attack的功能,python的class機制會將Riven的函數屬性attack綁定給r1,r1相當于拿到了一個指針,指向Riven類的attack功能
除此之外r1.attack()會將r1傳給attack的第一個參數
對象(實例)名稱空間
創建一個對象(實例),就會創建一個對象(實例)的名稱空間,存放著對象的名字,稱為對象(實例)的屬性
在obj.name會先從obj自己的名稱空間里找name,找不到則去類中找,類也找不到就找父類...最后都找不到就拋出異常
2 基于面向對象設計程序
要嚴格按照下面的流程:
1 面向對象程序設計 OOD
- 找對象-->找類(歸納對象共同的特征和技能,每個對象獨有的特征)
2面向對象程序編程OOP
- 先定義類--實例化對象
要針對當前的額應用場景
對象:學校--->歸類
共有的特征:商標
共有的技能:招生
獨有的特征:地址,老師們 、課程
```python
class School:
tag
對象:老師
共有的特征:無
共有的技能:授課
獨有的特征:名字,level,課程
對象:學生
共有的特征:
共有的技能:search_score,handin
獨有的特征:name,id,
轉載于:https://www.cnblogs.com/Python666/p/6722822.html
總結
以上是生活随笔為你收集整理的Python 面向对象(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SSL 1624——小萨的烦恼【最短路】
- 下一篇: websocket python爬虫_p