面向過程與物件導向
面向過程的程式設計的核心是過程(流水線式思維),過程即解決問題的步驟,面向過程的設計就好比精心設計好的一條流水線,考慮周全什麼時候處理什麼東西。
優點:極大降低了寫程式的複雜度,只需要順著要執行的步驟,堆疊**即可。
缺點:一套流水線或者流程就是解決乙個問題,**牽一髮而動全身。
應用場景:一旦完成基本很少改變的場景,著名的例子有linux核心,git,以及apache http server等。
物件導向的程式設計的核心是物件(上帝式思維),要理解物件為何物,必須要把自己當成上帝,上帝眼裡世間存在的萬物皆為物件,不存在的也可以創造出來。物件導向的程式設計好比如如來設計西遊記,如來要解決的問題是把經書傳到東土大唐,如來想了想解決問題需要四個人:唐僧,孫悟空,沙和尚,八戒,每個人都有各自的技能和特徵(這就是物件導向的該概念,特徵和技能分別對應物件的屬性和方法),然而這並不好玩,於是如來又安排一群妖魔鬼怪,又怕師徒四人在取經路上被搞死,有安排了一群神仙保駕護航,都是物件。然後開始取經,師徒四人與妖魔鬼怪神仙相互纏鬥著,直到最後取得真經。如來根本不會管師徒四人按照什麼流程去取。
優點:解決了程式的擴充套件性。對某個物件單獨修改,會立刻反映到整個體系中,如對遊戲中乙個人物引數的特徵技能修改都很容易。
缺點:可控性查,無法面向過程的程式的程式設計流水線式的可以精準的**問題的流程處理與結果,物件導向的程式一旦開始就由物件之間的互動解決問題,即便是上帝也無法**結果。於是我們經常看到乙個遊戲角色的某一引數的修改極有可能導致陰霸技能的出現,一刀砍死3個人,這個遊戲就失去了平衡。
應用場景:需求經常變化的軟體,一般需求的變化都集中在使用者層,網際網路應用,企業內部軟體,遊戲等都是物件導向大顯身手的好地方。
在python中,物件導向的程式設計並不是全部。
物件導向程式設計可以使程式的維護和擴充套件變得更簡單,並且可以大大提高程式開發效率,另外,基於物件導向的的程式可以使其他人更容易理解你的**的邏輯,從而使團隊開發變得更加從容。
了解一些名詞:類、物件、例項、例項化、
類:具有相同特徵的一類事物(人、狗、老虎)
物件/例項:具體的某一事物(隔壁阿花、樓下旺財)
例項化:類——>物件的過程
類和物件
python中一切皆為物件,型別的本質就是類。
print(type(dict)) #
d=dict(name='eva') #例項化
print(d.pop('name')) #向d發一條訊息,執行d的方法pop
從上面的例子來看,字典就是一類資料結構,我一說字典你就知道是那個用{}表示,裡面由k-v鍵值對的東西,它還具有一些增刪改查的方法。但是我一說字典你能知道字典裡具體存了哪些內容麼?不能,所以我們說對於乙個類來說,它具有相同的特徵屬性和方法。
而具體的這個字典,它是乙個字典,可以使用字典的所有方法,並且裡面有了具體的值,它就是字典的乙個物件。物件就是已經實實在在存在的某乙個具體的個體。
再舉乙個其他的例子,通俗一點,比如你現在有乙個動物園,你想描述這個動物園,那麼動物園裡的每一種動物就是乙個類,老虎、天鵝、鱷魚、熊。他們都有相同的屬性,比如身高體重出生時間和品種,還有各種動作,比如鱷魚會游泳,天鵝會飛,老虎會跑,熊會吃。
但是這些老虎熊啥的都不是具體的某乙隻,而是一類動物。雖然他們都有身高體重,但是你卻沒有辦法確定這個值是多少。如果這個時候給你乙隻具體的老虎,而你還沒死,那你就能給他量量身高稱稱體重,這些數值是不是就變成具體的了?那麼具體的這乙隻老虎就是乙個具體的例項,也是乙個物件。不止這乙隻,其實每乙隻具體的老虎都有自己的身高體重,那麼每乙隻老虎都是老虎類的乙個物件。
在python中,用變數表示特徵,用函式表示技能,因而具有相同特徵和技能的一類事物就是『類』,物件是則是這一類事物中具體的乙個。
定義乙個類
class person: #定義乙個人類
role = 'person' #人的角色屬性都是人
def __init__(self,name):
self.name = name # 每乙個角色都有自己的暱稱;
def walk(self): #人都可以走路,也就是有乙個走路方法
print("person is walking...")
print(person.role) #檢視人的role屬性
print(person.walk) #引用人的走路方法,注意,這裡不是在呼叫
egg = person('egon') #類名()就等於在執行person.__init__()
#執行完__init__()就會返回乙個物件。這個物件類似乙個字典,存著屬於這個人本身的一些屬性和方法。
例項化的過程就是類——>物件的過程
原本我們只有乙個person類,在這個過程中,產生了乙個egg物件,有自己具體的名字、攻擊力和生命值。
語法:物件名 = 類名(引數)
檢視呼叫和方法
print(egg.name) #檢視屬性直接 物件名.屬性名
print(egg.walk()) #呼叫方法,物件名.方法名()
self:在例項化時自動將物件/例項本身傳給__init__的第乙個引數,你也可以給他起個別的名字,但是正常人都不會這麼做。
類屬性補充:
一:我們定義的類的屬性到底存到**了?有兩種方式檢視
dir(類名):查出的是乙個名字列表
類名.__dict__:查出的是乙個字典,key為屬性名,value為屬性值
二:特殊的類屬性
類名.__name__# 類的名字(字串)
類名.__doc__# 類的文件字串
類名.__base__# 類的第乙個父類(在講繼承時會講)
類名.__bases__# 類所有父類構成的元組(在講繼承時會講)
類名.__dict__# 類的字典屬性
類名.__module__# 類定義所在的模組
類名.__class__# 例項對應的類(僅新式類中)
類命名空間與物件、例項命名空間
建立乙個類就會建立乙個類的命名空間,用來儲存類中定義的所有名字,這些名字稱為類的屬性
而類有兩種屬性:靜態屬性和動態屬性
靜態屬性就是直接在類中定義的變數
動態屬性就是定義在類中的方法
類的資料屬性是共享給所有物件的
print(id(egg.role))
print(id(person.role))
類的動態屬性是繫結到所有物件的
print(egg.attack)
print(person.attack)
建立乙個物件/例項就會建立乙個物件/例項的命名空間,存放物件/例項的名字,稱為物件/例項的屬性
在obj.name會先從obj自己的命名空間裡找name,找不到則去類中找,類也找不到就找父類...最後都找不到就丟擲異常
軟體重用的重要方式除了繼承之外還有另外一種方式,即:組合
組合指的是,在乙個類中以另外乙個類的物件作為資料屬性,稱為類的組合
圓環是由兩個圓組成的,圓環的面積是外面圓的面積減去內部圓的面積。圓環的周長是內部圓的周長加上外部圓的周長。
這個時候,我們就首先實現乙個圓形類,計算乙個圓的周長和面積。然後在"環形類"中組合圓形的例項作為自己的屬性來用
from math import pi
class circle:
定義了乙個圓形類;
提供計算面積(area)和周長(perimeter)的方法
def __init__(self,radius):
self.radius = radius
def area(self):
return pi * self.radius * self.radius
def perimeter(self):
return 2 * pi *self.radius
circle = circle(10) #例項化乙個圓
area1 = circle.area() #計算圓面積
per1 = circle.perimeter() #計算圓周長
print(area1,per1) #列印圓面積和周長
class ring:
定義了乙個圓環類
提供圓環的面積和周長的方法
def __init__(self,radius_outside,radius_inside):
self.outsid_circle = circle(radius_outside)
self.inside_circle = circle(radius_inside)
def area(self):
return self.outsid_circle.area() - self.inside_circle.area()
def perimeter(self):
return self.outsid_circle.perimeter() + self.inside_circle.perimeter()
ring = ring(10,5) #例項化乙個環形
print(ring.perimeter()) #計算環形的周長
print(ring.area()) #計算環形的面積
Python之物件導向 物件導向基礎
一 面向過程 物件導向對比 1 面向過程 根據業務邏輯從上到下寫壘 2 函式式思想 將某功能 封裝到函式中,日後便無需重複編寫,僅呼叫函式即可 3 物件導向 對函式進行分類和封裝 1 2 3一步一步抽象,函式式是走向物件導向的中間步驟 函式式的應用場景 各個函式之間是獨立且無共用的資料 物件導向程式...
python物件導向基礎
類是例項的模版,例項是根據類建立的乙個具體物件,每個物件都有相同的方法,但是各自的資料不同。如果要讓內部屬性不被外部訪問,可以把屬性的名稱前加上兩個下劃線 在python中,例項的變數名如果以 開頭,就變成了乙個私有變數 private 只有內部可以訪問,外部不能訪問 當子類和父類都存在相同的run...
python 物件導向基礎
usr bin env python coding utf 8 類的簡單測試 class person object 這是類的文件 建構函式,python中物件的屬性值動態新增 python 不不支援函式過載 def init self,name,id self.name name 例項變數 sel...