對象
我們可以通過以下幾點來描述對象
- 它們表示所開發(fā)的應用程序內(nèi)的實體
- 實體之間可以通過交互來解決現(xiàn)實世界的問題
- 例如,Person是實體,而Car也是實體。Person可以駕駛Car,從一個地方開到另一個地方
類
類可以幫助開發(fā)人員表現(xiàn)現(xiàn)實世界中的主體
- 類可以定義對象的屬性和行為。屬性是數(shù)據(jù)成員,行為由成員函數(shù)表示。
- 類包含了構(gòu)造函數(shù),這些函數(shù)的作用是為對象提供初始狀態(tài)。
- 類就像模版一樣,非常易于重復復用。
例如,類Person可以帶有屬性name和age,同時提供成員函數(shù)gotoOffice(),以定義去辦公室工作的行為。
方法
以下幾點描述了方法在面向?qū)ο笾械淖饔谩?
- 它們表示對象的行為
- 方法可以對屬性進行處理,從而實現(xiàn)所需的功能。
下面是python中的一個列子
class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age
def get_person(self):
return "
"%(self.name,self.age)
p = Person("John",32)
print("Type :",type(p),"內(nèi)存ID:",id(p))
運行示列如下:
面向?qū)ο缶幊痰闹饕拍睿?
封裝
- 對象的行為對于外部世界來說是不可見的,或者說對象的狀態(tài)信息是私密的。
- 客戶端不能通過直接操作來改變對著的內(nèi)部狀態(tài)。相反,客戶端需要通過發(fā)送信息來請求對象來改變其內(nèi)部狀態(tài)。對象可以根據(jù)請求的類型,通過特定的成員函數(shù)(例如 GET 或 POST)改變他們的內(nèi)部狀態(tài),以作出相應的相應。
- 在Python中,封裝(數(shù)據(jù)和方法隱藏)的概念不是隱式的,因為它沒有提供封裝的關(guān)鍵字,例如public,private,protected(在諸如C++或Java之類的語言中,都提供了這些關(guān)鍵字)。當然,如果在變量或函數(shù)名前加前綴__,可以將其訪問屬性變?yōu)樗接小?
多態(tài)
多態(tài)的特性主要如下:
-
多態(tài)有倆種類型。
- 對象根據(jù)輸入?yún)?shù)提供方法不同的實現(xiàn)。
- 不同類型的對象可以使用相同的借口。
- 對于Python來說 多態(tài)是該語言的內(nèi)置功能。例如:操作符"+"可以應用于倆個整數(shù)進行加法運算,也可以應用于字符串來鏈接它們。在下面的示列中,字符串,元祖或列表都可以通過整數(shù)索引來訪問。
它為我們展示了Python內(nèi)置類型的多態(tài):
a = "John"
b = (1,2,3)
c = [3,4,5,6]
print(a[1],b[0],c[2])
繼承
以下幾點有助于我們更好地理解繼承過程
- 繼承表示一個類可以繼承父類的(大部分)功能。
- 繼承被描述為一個重用基類中定義的功能并允許對原始軟件的實現(xiàn)進行獨立擴展的選項。
- 繼承可以利用不同類的對象之間的關(guān)系建立層次結(jié)構(gòu)。與Java不同,而Python支持多重繼承(繼承多個基類).
在下面的代碼示列中,類A是基類,類B繼承了類A的特性。因此,類B的對象可以訪問類A的方法:
class A:
def a1(self):
print("a1")
class B(A):
def b(self):
print("b")
b = B()
a.a1()
抽象
抽象的主要特征如下所示:
- 它提供了一個簡單的客戶端接口,客戶端可以通過該接口與類的對象進行交互,并可以調(diào)用該接口中定義的各個方法。
- 它將內(nèi)部類的復雜性抽象為一個接口,這樣的客戶端就不需要知道內(nèi)部實現(xiàn)了。
在下面的列子中,我們通過add()方法對類Adder的內(nèi)部細節(jié)進行了抽象處理:
class Adder:
def __init__(self):
self.sum = 0
def add(self,value):
self.sum += value
acc = Adder()
for i in range(99):
acc.add(i)
print(acc.sum)
組合
組合是指以下幾點
- 它是一種將對象或類組合成更復雜的數(shù)據(jù)結(jié)構(gòu)或軟件實現(xiàn)的方法。
- 在組合中,一個對象可用于調(diào)用其他模塊中的成員函數(shù),這樣一來,無需通過繼承就可以實現(xiàn)基本功能的跨模塊使用。
在下面的示列中,類A的對象被組合到類B中:
class A(object):
def a1(self):
print("a1")
class B(object):
def a2(self):
print("b")
a().a1()
objectB = B()
objectB.b()
面向?qū)ο蟮脑O計原則
開放封閉原則
開發(fā)/封閉原則規(guī)定,類或者對象及其方法對于擴展來說,應該是開放的,但是對于修改來說,應該是封閉的。
簡單來說,這意味著當你開發(fā)軟件應用的時候,一定確保以通用的方式來編寫類或者模塊,以便每當需要擴展類或者對象行為的時候不必修改類本身。相反,類的簡單擴展將有助于新的行為。
例如,開放/封閉原則能夠在下列情形中表現(xiàn)得淋漓盡致:為了實現(xiàn)所需行為,用戶必須通過擴展抽象基類來創(chuàng)建類的實現(xiàn),而不是通過修改抽象類。
本設計原則的優(yōu)點如下:
- 現(xiàn)有的類不會被修改,因此退化的可能性較小。
- 它還有助于保持以前代碼的向后兼容性。
控制反轉(zhuǎn)原則
控制反轉(zhuǎn)是指,高層級的模塊不應該依賴于低層級的模塊,它們應該都依賴于抽象。細節(jié)應該依賴于抽象,而不是抽象依賴于細節(jié)。
該原則建議任何倆個模塊都不應該以緊密方式相互依賴。事實上,基本模塊和從屬模塊應當在它們之間提供一個抽象層來耦合。這個原則還建議,類的細節(jié)應該描繪抽象。在某些情況下,這種觀念會反轉(zhuǎn),也就是實現(xiàn)細節(jié)本身決定了抽象,這種情況是應該避免的。
控制反轉(zhuǎn)原則的優(yōu)點如下。
-
消除了模塊間的緊耦合,因此消除了系統(tǒng)中的復雜性/剛性。
-
由于依賴模塊之間有一個明確的抽象層(由鉤子或者參數(shù)提供),因此便于通過更好的方式處理模塊之間的依賴關(guān)系。
接口隔離原則
接口隔離原則規(guī)定,客戶端不應該依賴于它們不需要使用的接口。
接口隔離原則的意思就是,軟件開發(fā)人員應該仔細地處理接口。例如,它提醒開發(fā)人員/架構(gòu)師開發(fā)的方法要與特定的功能緊緊相關(guān)。如果存在與接口無關(guān)的方法,那么依賴于該接口的類就必須實現(xiàn)它,實際上這是毫無必要的。
例如,一個Pizza接口不應該提供名為add_chicken()方法。基于接口的Veg Pizza不應該強勢實現(xiàn)該方法。
本實際原則的優(yōu)點如下所示。
-
它強制開發(fā)人員編寫"瘦身型"接口,并使用方法與接口緊緊相關(guān)。
-
放置向接口中隨意添加方法。
單一職責原則
單一職責的含義是:類的職責單一,引起類變化的原因單一。
這個原則是說,當我們開發(fā)類時,它應該為特定的功能服務。如果一個類實現(xiàn)了倆個功能,那么最好將它們分開。也就是說,功能才是改變的理由。例如,一個類可以因為所需行為的變化而進行修改,但是如果一個類由于倆個因素(基本上是倆個功能的改變)而改變,那么該類就應該進行相應的分割。
本設計原則的優(yōu)點如下:
-
每當一個功能發(fā)生變化時,除了特定的類需要改變外,其他類無需變動。
-
此外,如果一個類有多種功能,那么依賴它的類必定會由于多種原因而經(jīng)歷多次修改,這是應該避免的。
替換原則
替換原則規(guī)定,派生類必須能夠完全取代基類。
這個原則很簡單,當應用程序開發(fā)人員編寫派生類時,該原則的含義就是他們應該擴展基類。此外,它還建議派生類應盡可能對基類封閉,以至于派生類本身可以替換基本而無需修改任何代碼。
更多文章、技術(shù)交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
