python基础——面向对象的程序设计
python基礎(chǔ)——面向?qū)ο蟮某绦蛟O(shè)計(jì)
?
1 什么是面向?qū)ο蟮某绦蛟O(shè)計(jì)
?
面向過程的程序設(shè)計(jì)的核心是過程,過程即解決問題的步驟,面向過程的設(shè)計(jì)就好比精心設(shè)計(jì)好一條流水線,考慮周全什么時(shí)候處理什么東西。
?
優(yōu)點(diǎn)是:極大的降低了程序的復(fù)雜度
?
缺點(diǎn)是:一套流水線或者流程就是用來解決一個(gè)問題,生產(chǎn)汽水的流水線無法生產(chǎn)汽車,即便是能,也得是大改,改一個(gè)組件,牽一發(fā)而動(dòng)全身。
?
應(yīng)用場景:一旦完成基本很少改變的場景,著名的例子有Linux內(nèi)核,git,以及Apache HTTP Server等
?
?
?
面向?qū)ο蟮某绦蛟O(shè)計(jì)的核心是對(duì)象。對(duì)象(object)基本上可以看做數(shù)據(jù)(特性)以及由一系列可以存取、操作這些數(shù)據(jù)的方法所組成的集合。
?
優(yōu)點(diǎn)是:解決了程序的擴(kuò)展性。對(duì)某一個(gè)對(duì)象單獨(dú)修改,會(huì)立刻反應(yīng)到整體體系中,如對(duì)游戲中一個(gè)人物參數(shù)的特征和技能修改都很容易。
?
缺點(diǎn)是:可控性差,無法向面向過程的程序設(shè)計(jì)流水線式的可以很精準(zhǔn)的預(yù)測問題的處理流程和結(jié)果,面向?qū)ο蟮某绦蛞坏╅_始就由對(duì)象之間的交互解決問題,即使是上帝也無法預(yù)測最終結(jié)果。
?
應(yīng)用場景:需求經(jīng)常變化的軟件,一般需求的變化都集中在用戶層,互聯(lián)網(wǎng)應(yīng)用,企業(yè)內(nèi)部軟件,游戲等都是面向?qū)ο蟮某绦蛟O(shè)計(jì)大顯身手的好地方。
?
?面向?qū)ο蟮某绦蛟O(shè)計(jì)并不是全部。對(duì)于一個(gè)軟件質(zhì)量來說,面向?qū)ο蟮某绦蛟O(shè)計(jì)知識(shí)用來解決擴(kuò)展性。
?
?
2 類和對(duì)象
?
對(duì)象(object)基本上可以看做數(shù)據(jù)(特性)以及由一系列可以存取、操作這些數(shù)據(jù)的方法所組成的集合。
?
類,可以看成種類,類型,從一組對(duì)象中提取到的相似部分。所有的對(duì)象都屬于一個(gè)類,稱為類的實(shí)例。
?
之前學(xué)習(xí)的數(shù)據(jù)類型就是類
print(int) print(Garen)輸出結(jié)果:
<class 'int'> <class '__main__.Garen'>
3 類
3.1 初始類
?
1 聲明類 (和聲明函數(shù)很相似)
類的定義格式 class 類名:'類的文檔字符串'類體2 創(chuàng)建一個(gè)類:
class Data:pass*Python編程中習(xí)慣類名使用單數(shù)單詞并且首字母大寫
?
類是數(shù)據(jù)與函數(shù)的結(jié)合,二者稱為類的屬性
class Garen: #定義英雄蓋倫的類,不同的玩家可以用它實(shí)例出自己英雄;camp='Demacia' #所有玩家的英雄(蓋倫)的陣營都是Demacia;def attack(self,enemy): #普通攻擊技能,enemy是敵人;enemy.life_value-=self.aggressivity #根據(jù)自己的攻擊力,攻擊敵人就減掉敵人的生命值。
3.2 類的作用1:屬性引用
屬性引用(類名.屬性)
(1)引用類的數(shù)據(jù)屬性(類名.變量名)
print(Garen.camp) # 引用類的數(shù)據(jù)屬性,該屬性與所有對(duì)象/實(shí)例共享輸出結(jié)果為:
Demacia
(2)引用類的函數(shù)屬性(類名.函數(shù)名)
print(Garen.attack) #引用類的函數(shù)屬性,該屬性也共享輸出結(jié)果為:
<function Garen.attack at 0x00000059CE8FAF28>?
(3)類的屬性操作
Garen.name='Garen1' #增加屬性 print(Garen.name) #查詢屬性輸出結(jié)果為:
Garen1?
del Garen.name #刪除屬性print(Garen.name)輸出結(jié)果為:
AttributeError: type object 'Garen' has no attribute 'name' #報(bào)錯(cuò)Garen.camp="aaaa" #修改屬性 print(Garen.camp)
輸出結(jié)果為:
aaaa
3.3 類的作用2:實(shí)例化
(1)__init__實(shí)例化
類名加括號(hào)就是實(shí)例化,會(huì)自動(dòng)觸發(fā)__init__函數(shù)的運(yùn)行,可以用他來為每個(gè)實(shí)例定制自己的特性
class Garen:camp='Demacia'def __init__(self,nickname,aggressivity=58,life_value=455):self.nickname=nickname #為自己的蓋倫起個(gè)別名;self.aggressivity=aggressivity #英雄都有自己的攻擊力;self.life_value=life_value #英雄都有自己的生命值;def attack(self,enemy):print("attack %s" % enemy)實(shí)例化:類名+括號(hào)
g1=Garen('草叢倫')#就是在執(zhí)行Garen.__int__(g1,’草叢倫’),然后執(zhí)行__init__內(nèi)的代碼g1.nickname=’草叢倫’等
(2)self作用
self的作用是在實(shí)例化時(shí)自動(dòng)將對(duì)象/實(shí)例本身傳給__init__的第一個(gè)參數(shù),self可以是任意名字,但是self是大家公認(rèn)的。
?這種自動(dòng)傳遞的機(jī)制還體現(xiàn)在g1.attack的調(diào)用上,后續(xù)會(huì)介紹
?
一:我們定義的類的屬性到底存到哪里了?有兩種方式查看
dir(類名):查出的是一個(gè)名字列表
類名.__dict__:查出的是一個(gè)字典,key為屬性名,value為屬性值
?
?二:特殊的類屬性
類名.__name__# 類的名字(字符串)
類名.__doc__# 類的文檔字符串
類名.__base__# 類的第一個(gè)父類(在講繼承時(shí)會(huì)講)
類名.__bases__# 類所有父類構(gòu)成的元組(在講繼承時(shí)會(huì)講)
類名.__dict__# 類的字典屬性
類名.__module__# 類定義所在的模塊
類名.__class__# 實(shí)例對(duì)應(yīng)的類(僅新式類中)
4 對(duì)象(實(shí)例)
對(duì)象是關(guān)于類而實(shí)際存在的一個(gè)例子,即實(shí)例
#類實(shí)例化得到g1這個(gè)實(shí)例
class Garen:camp='Demacia'def __init__(self,nickname,aggressivity=58,life_value=455):self.nickname=nickname #為自己的蓋倫起個(gè)別名;self.aggressivity=aggressivity #英雄都有自己的攻擊力;self.life_value=life_value #英雄都有自己的生命值;def attack(self,enemy):print("attack %s" % enemy)g1=Garen('草叢倫')
4.1 對(duì)象的屬性引用和綁定方法
(1)對(duì)象(實(shí)例)只有一種作用:屬性引用
格式: 實(shí)例名.類的變量名
?????? 實(shí)例名.綁定方法
?????? 實(shí)例名.實(shí)例自己的變量名
print(g1.nickname) print(g1.aggressivity) print(g1.life_value)輸出結(jié)果為:
草叢倫 58 455?
(2)對(duì)象的屬性操作
查看屬性信息
print(g1.nickname)輸出結(jié)果:
草叢倫
修改屬性信息
g1.nickname="倫哥" print(g1.nickname)輸出結(jié)果為:
倫哥
添加屬性
g1.sex="female" print(g1.sex)輸出結(jié)果為:
Female
刪除屬性:
del g1.sex print(g1.sex)輸出結(jié)果為:
AttributeError: 'Garen' object has no attribute 'sex' #報(bào)錯(cuò)
(3)查看實(shí)例屬性
同樣是dir和內(nèi)置__dict__兩種方式
特殊實(shí)例屬性
__class__
__dict__
(4)對(duì)象(實(shí)例)的綁定方法
對(duì)象本身只有數(shù)據(jù)屬性,但是python的class機(jī)制會(huì)將類的函數(shù)綁定到對(duì)象上,稱為對(duì)象的方法,或者叫綁定方法。
print(g1.attack) #對(duì)象的綁定方法 print(Garen.attack) #對(duì)象的綁定方法attack本質(zhì)就是調(diào)用類的函數(shù)attack的功能,二者是一種綁定關(guān)系輸出結(jié)果為:
<bound method Garen.attack of <__main__.Garen object at 0x00000017370815F8>> <function Garen.attack at 0x0000001737085048>對(duì)象的綁定方法的特別之處在于:obj.func()會(huì)把obj傳給func的第一個(gè)參數(shù)
4.2 對(duì)象的交互
仿照Garen類創(chuàng)建一個(gè)Riven類:
實(shí)例Riven類
交互:瑞雯攻擊草叢倫
class Riven:camp='Noxus'def __init__(self,nickname,aggressivity=54,life_value=414):self.nickname=nickname #為自己的瑞雯起個(gè)別名;self.aggressivity=aggressivity #英雄都有自己的攻擊力;self.life_value=life_value #英雄都有自己的生命值;def attack(self,enemy):print("attack %s" % enemy)enemy.life_value -= self.aggressivityg1=Garen('草叢倫') r1=Riven('瑞雯') print(g1.life_value) r1.attack(g1) print(g1.life_value)輸出結(jié)果為:
455 瑞雯 attack 草叢倫 401?
轉(zhuǎn)載于:https://www.cnblogs.com/niejinmei/p/6761854.html
總結(jié)
以上是生活随笔為你收集整理的python基础——面向对象的程序设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php类中双冒号和-的区别
- 下一篇: Python安装pip