詳解Python面向對象知識點
目前代碼技能已經成了測試同學面試考核的剛需,對于測試開發來講需求最大的是java和python兩門語言,二者也都是面向對象語言。對于剛入門代碼的同學來說面向對象相關的概念比較難于理解,而面向對象編程相關的知識點偏偏又是面試中的高頻問題,所以本文我以python為例,帶大家快速搞定面向對象中的核心概念并通過代碼實現的方式來幫助大家對其加深理解!
面向對象基礎
對象
對象有兩個層次的概念,現實生活中對象指的是客觀世界的實體;而程序中對象就是一組變量和相關方法的集合,其中變量表明對象的狀態,方法表明對象所具有的行為。可以將現實生活中的對象經過抽象,映射為程序中的對象,對象是對現實的高度抽象。
類
對象在程序中是通過一種抽象數據類型來描述的,這種抽象數據類型即Class。類是描述對象的“基本原型”,它定義一類對象所能擁有的數據和能完成的操作。在面向對象的程序設計中,類是程序的基本單元。
類和對象的關系
對象是類的一個實例,創建一個對象就是類進行了實例化,從代碼角度講就是在內存中開辟了一塊新的地址空間運行程序。一個類可以創建無數個實例(只要計算機的內存足夠大),使用python代碼實現如下:
dog =Animal()
即對象dog是類Animal的一個實例。
屬性
存儲對象的狀態,可以理解為變量。
方法
實現對象的行為,可以理解為函數。
上面是面向對象理論的解釋,我們以去動物園看動物為例,我們通常說去看動物,但是沒有人能夠看到動物這個抽象的東東,我們只能看到具體的某一種類的動物。這里的動物就是類的概念,而我們看的具體動物,例如:東北虎就是實例。關于動物的種類、顏色以及雌雄就是動物的屬性,而動物具備的基礎能力,例如:跑、吃、叫等等,我們則可以將其定義為方法。
面向對象三原則
面向對象三原則包括:封裝、繼承、多態。
封裝
封裝實際上是使用方法將類的數據隱藏起來,控制用戶對類的修改和訪問數據的程度。我們在使用api時,如果提供方不給我們源碼,我們是無法知道其內部實現的,但是這并不會妨礙我們對api的使用。簡單規則如下:
xx: 公有變量或方法;
_xx:變量或方法前面加雙前置下劃線,無法在外部直接訪問;
class Demo(object):
public_var="共有變量"
__private_var = "私有變量"
def public_func(self):
print("共有方法")
def __private_func(self):
print("私有方法")
d=Demo()
d.public_func()
d.__private_func()
當執行代碼時會報錯:
AttributeError: 'Demo' object has no attribute '__private_func'
錯誤信息提示,Demo中找不到方法__private_func,原因是該方法是私有方法,不能被Demo類以外的模塊或者類調用!所以大家在設計類中的方法或者屬性時需要考慮好是否需要被外部調用,如果需要則設計成xx形式,如果不需要則設計成__xx形式。對于剛入門編碼的小白來說,把屬性和方法都設計成共有即可。
繼承
繼承性是面向對象程序設計語言的另一基本特征,通過繼承可以實現代碼的復用。繼承而得到的類為子類,被繼承的類為父類,所有直接或間接被繼承的類都是父類。繼承是子類利用父類中定義的方法和變量,就像它們屬于子類自己一樣。Python中支持多重繼承。如下代碼表示Dog類繼承Animal類并通過Dog(Animal)實現,在python中object類是所有類的父類,所以Animal繼承object類。
class Animal(object):
def run(self):
print('Animal isrunning...')
class Dog(Animal):
pass
子類使用父類的run方法就像使用他自己的方法一樣!
dog=Dog()
dog.run()
特征:
(1)繼承關系是傳遞的。如果類C繼承類B,類B繼承類A(多繼承),則類C既有從類B那里繼承下來的屬性與方法,也有從類A那里繼承下來的屬性與方法,還可以有自己新定義的屬性和方法。繼承來的屬性和方法盡管是隱式的,但仍是類C的屬性和方法。繼承是在一些比較一般的類的基礎上構造、建立和擴充新類的最有效的手段。
(2)繼承簡化了人們對事物的認識和描述,能清晰體現相關類之間的層次結構關系。
(3)繼承提供了軟件復用功能。如果類B繼承類A,則建立類B時只需要再描述與基類(類A)不同的少量特征(數據成員和成員方法)即可。這種做法能減小代碼和數據的冗余度,大大增加程序的重用性。
(4)繼承通過增強一致性來減少模塊間的接口和界面,大大增加了程序的易維護性。
(5)提供多重繼承機制。從理論上說,一個類可以是多個一般類的特殊類,它可以從多個一般類中繼承屬性與方法,這便是多重繼承。
多態
多態(Polymorphism)按字面的意思就是“多種狀態”。在面向對象語言中,接口的多種不同的實現方式即為多態。引用Charlie Calverts對多態的描述——多態性是允許你將父對象設置成為一個或更多的他的子對象相等的技術,賦值之后,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。類具有繼承關系,并且子類類型可以向上轉型看做父類類型。舉一個例子大家就懂了
#定義類Animal
class Animal(object):
def run(self):
print('Animal is running...'
#定義類Chicken,重寫Animal的run方法
class Chicken(Animal):
def run(self):
print('Chicken is running with 2 legs')
#定義類Fish,重寫Animal的run方法
class Fish(Animal):
def run(self):
print('fish is swimming')
chicken=Chicken()
chicken.run()
fish=Fish()
fish.run()
animal=Animal()
animal.run()
#定義一個函數調用run方法
def which_animal_running(p_obj):
p_obj.run()
這種行為稱為多態。也就是說,方法調用將作用在p_obj的實際類型上。它實際上擁有自己的 run()方法以及從Animal類繼承的 run()方法,但調用 p_obj.run()總是先查找它自身的定義,如果沒有定義,則順著繼承鏈向上查找,直到在某個父類中找到為止。
which_animal_running(chicken) #執行Chicken類的run方法
which_animal_running(fish) #執行Fish類的run方法
which_animal_running(animal) #執行Animal類的run方法