面向對象OOP
OOP:Object Oriented Programming,面向對象編程,面向對象中的對象(Obiect),通常是指客觀世界中存在的對象,這個對象具有唯一性,對象之間各不相同,各有各的特點,每個對象都有自己的運動規律和內部狀態;對象與對象之間又是可以相互聯系、相互作用的。另外,對象也可以是一個抽象的事物。例如,可以從圓形、正方形、三角形等圖形抽象出一個簡單圖形,簡單圖形就是一個對象,它有自己的屬性和行為,圖形中邊的個數是它的屬性,圖形的面積也是它的屬性,輸出圖形的面積就是它的行為。概括地講,面向對象技術是一種從組織結構上模擬客觀世界的方法。
對象Object由屬性和行為組成,在 Python 中,一切都是對象。即不僅是具體的事物稱為對象,字符串、函數等也都是對象
類class
類是封裝對象的屬性和行為的載體,反過來說,具有相同屬性和行為的一類實體被稱為類.將類實例化Instance之后就是對象
面向對象程序設計的特征
面向對象程序設計具有三大基本特征:封裝、繼承和多態
封裝
封裝是面向對象編程的核心思想,將對象的屬性和行為封裝起來,而將對象的屬性和行為封裝起來的載體就是類,類通常對客戶隱藏其實現細節,這就是封裝的思想。
繼承
繼承是實現重復利用的重要手段,子類通過繼承復用了父類的屬性和行為的同時,又添加了子類特有的屬性和行為。python沒有接口interface的概念,繼承是支持多個父類繼承的.而C#是單繼承的,C#通過實現接口來偽裝多繼承
多態
將父類對象應用于子類的特征就是多態.比如阿貓(Cat)阿狗(Dog)都是動物(Animal),都是Run()這個行為,但阿貓(Cat)和阿狗(Dog)運動行為是不一樣的
定義類class
class ClassName:
? ? '''類的幫助信息'''? ?#類的描述
? ? statement? ? ? ? ? ? ?#類體
ClassName:用于指定類名,一般使用大寫字母開頭,如果類名中包括兩個單詞,第二個單詞的首字母也大寫,這種命名方法也稱為“Pascal命名法”,這是慣例。當然,也可根據自己的習慣命名,但是一般推薦按照慣例來命名。
""類的幫助信息":用于指定類的文檔字符串,定義該字符串后,在創建類的對象時,輸入類名和左側的括號“(”后,將顯示該信息。
statement: 類體,主要由類變量(或類成員)、方法和屬性等定義語句組成。如果在定義類時沒想好類的具體功能,也可以在類體中直接使用 pass 語句代替。
創建類的實例
class 語句本身并不創建該類的任何實例。所以在類定義完成以后,可以創建類的實例,即實例化該類的對象。創建類的實例的語法如下:
ClassName(parameterList)
實例化類時,將自動調用__init__()方法,該方法可以認為是C#中的構造方法(函數)
__init__()方法
在創建類后,通常會創建一個 __init__()方法。該方法是一個特殊的方法,類似 Java 語言中的構造方法。每當創建一個類的新實例時,Python 都會自動執行它。 __init__()方法必須包含一個 self參數,并且必須是第一個參數。self參數是一個指向實例本身的引用,用于訪問類中的屬性和方法。在方法調用時會自動傳遞實際參數 self。因此,當 __init__()方法只有一個參數時,在創建類的實例時,就不需要指定實際參數了。self參數類似于C#的this,代表這個類本身的對象
創建類的成員來訪問
創建實例方法并訪問
所謂實例方法,是指在類中定義的函數。該函數是一種在類的實例上操作的函數。同__init__()方法一樣,實例方法的第一個參數必須是 self,并且必須包含一個 self參數。
實例方法創建完成后,可以通過類的實例名稱和點(.)操作符進行訪問。
def functionName(self,parameterList):
? ? ?block
functionName:用于指定方法名,一般使用小寫字母開頭;
self:必要參數,表示類的實例,其名稱可以是 self 以外的單詞,使用 self 只是一個習慣而己:
parammeterlist:用于指定除 self參數以外的參數,各參數間使用逗號“,”進行分隔;
block:方法體,實現的具體功能。
創建屬性成員來訪問
數據成員是指在類中定義的變量,即屬性,根據定義位置,又可以分為類屬性和實例屬性。
類屬性
類屬性是指定義在類中,并且在函數體外的屬性。類屬性可以在類的所有實例之間共享值,也就是
在所有實例化的對象中公用。類屬性可以通過類名稱或者實例名訪問。
實例屬性
實例屬性是指定義在類的方法中的屬性,只作用于當前實例中。
實例屬性只能通過實例名訪問。如果通過類名訪問實例屬性,將拋出異常
訪問限制
在類的內部可以定義屬性和方法,而在類的外部則可以直接調用屬性或方法來操作數據,從而隱藏了類內部的復雜邏輯。但是,Python 并沒有對屬性和方法的訪問權限進行限制。為了保證類內部的某些屬性或方法不被外部訪問,可以在屬性或方法名前面添加單下劃線(_f)、雙下劃線( __foo)或首尾加雙下劃線( __f__?),從而限制訪問權限。其中,單下劃線、雙下劃線、首尾雙下劃線的作用如下:
_f:以單下劃線開頭的表示 protected(保護)類型的成員,只允許類本身和子類進行訪問,但不能使用“from module import*”語句導入。
__f:雙下劃線表示 private(私有)類型的成員,只允許定義該方法的類本身進行訪問,而且也不能通過類的實例進行訪問,但是可以通過“類的實例名.類名 xxx”方式訪問。
__f__:首尾雙下劃線表示定義特殊方法,一般是系統定義名字,如__init__()
@property屬性
創建用于計算的屬性@property
在 Python 中,可以通過@property(裝飾器)將一個方法轉換為屬性,從而實現用于計算的屬性。將方法轉換為屬性后,可以直接通過方法名來訪問方法,而不需要再添加一對小括號“()”,這樣可以讓代碼更加簡潔。
為屬性添加安全保護機制
在 Python 中,默認情況下,創建的類屬性或者實例是可以在類體外進行修改的,如果想要限制其不能在類體外修改,可以將其設置為私有的,但設置為私有后,在類體外也不能獲取它的值。如果想要創建一個可以讀取,但不能修改的屬性,那么可以使用@property 實現只讀屬性。
通過屬性不僅可以將屬性設置為只讀屬性,而且可以為屬性設置攔截器,即允許對屬性進行修改,
但修改時需要遵守一定的約束。
示例程序:
class Snake:def __init__(self):print("實例化類時,自動調用構造函數__init__()")
snake = Snake()
class Mammal:'''哺乳動物'''heart='心形' #成員變量,需要類名.成員變量sequence=0def __init__(self,tooth,eye):Mammal.sequence=Mammal.sequence+1print("我是第",Mammal.sequence,"只哺乳動物,牙齒是:",tooth,",眼睛是:",eye,"心臟:",Mammal.heart)def run(self,state):'''哺乳動物奔跑方式,自定義函數:param state: 奔跑方式'''print("動物正在奔跑,奔跑方式為:",state)
dog=Mammal("犬齒","卵形")
dog.run("跨步")
for i in range(4):Mammal("臼齒","小眼")
class Rectangle:def __init__(self,width,height):self.width=widthself.height=height@property #將方法轉換為屬性def area(self):return self.width*self.height
rect=Rectangle(30,40)
print("矩形的寬度:",rect.width,",矩形的高度:",rect.height,",面積:", rect.area)
運行如圖: