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