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