1、概要
面向對象(Object Oriented,簡稱OO)思想在Java及其他編程語言中使用非常廣泛,面向對象的思想也來自於生活中的靈感,很多現實世界的物體或聚合體我們都可以對其進行抽象化歸納,抽象思維是一種思想活動,依靠想象力和對事物的特徵的通用特性進行整理,最終形成一個或一類的具化對象。如:人,我們可以理解爲一種抽象的集合,具有名字、頭、身、手、腳、能直立行走、可以使用工具、具備自主意識、等一些列特徵,我們可以將這一系列公共特徵組合在一起看成一個對象,即:人。
其中人這個對象,在編程語言中我們需要將這個對象表示出來,也就是我們說的類(Class),在類中,我們可以將名字等看作是類的屬性,將直立行走等行爲看作是類的方法。
引入這種面向對象的思想之後,我們可對現實世界中繁多的物體進行類化映射到程序世界裏面,結合一些設計原則和設計模式,我們就可以構建更爲複雜和龐大的程序,同時也更易於維護和擴展,當有了類之後,彷彿一切都有了規則和秩序。
本博主將按照Java語言的面向對象的特性,去學習Python語言的面向對象知識。
其中面向對象最重要的三個特徵:封裝、繼承、多態。將圍繞這三個特徵切入學習。
在學習之前我們需要了解一些基本的知識,那麼如如何定義類、如何使用類實例、如何調用類屬性和方法?
2、創建一個類
類的基本組成單元:屬性和方法。
類的語法格式如下:
class 類名:
# 屬性
# 方法()
舉個例子:
創建People類,此類包含兩個屬性,和兩個方法。
# 定義對象爲人的類
class People:
# 類的屬性(可以是公共、也可以是私有的)
# 公有屬性,能在本類之外調用
name = ""
# 私有屬性,不能在本類之外調用
__privacy = ""
# 類的默認構造函數
def __init__(self):
print("調用默認構造函數")
# 自定義構造函數
# def __init__(self, name):
# self.name = name
# print(self.name + "調用自定義的構造函數")
# 類的公有方法,無外部參數
def walk(self):
print("直立行走")
# 類的私有方法,有外部參數
def do(self, someThing):
print(self.name + someThing)
類的屬性分爲:公有和私有兩類。
- 公有屬性:可在其他類中訪問, 屬性名前沒有兩根下劃線__。如上例子中的:name
- 私有屬性:不可在其他類中訪問,屬性名前有兩根下劃線__。如上例中的:__privacy
類的方法也分爲:公有和私有兩類。
- 公有方法:可在其他類中訪問, 方法名前沒有兩根下劃線__。如上例子中的:do
- 私有方法:不可在其他類中訪問,方法名前有兩根下劃線__。如上例中的:__walk
提煉一下類的方法的語法格式:
def 方法名稱(self,參數1,參數2,參數3,...參數n):
#方法體
注意:類中的方法,第一個參數需要指定爲self,這個是python約定的,且在調用該公共方法時,這個self對應的參數是不需要傳入的,只需要傳入,參數1,參數2,參數3,…參數n即可。
構造函數:
上面例子中的__init__即爲類默認的構造函數,其中構造函數可以自定義,使用自定義構造函數之後,默認構造函數不再生效。構造函數執行順序和java是一致的,類實例化的時候調用。
很詭異的地方是,自定義構造函數之後,默認構造函數不在生效了。
補充一點:靜態方法,在方法名上方添加這個註解@staticmethod即可。
3、使用這個類
先導入類,然後創建類的實例,然後通過類的實例調用公共屬性和公共方法。
# 導入類
from People import People
# 自定義構造函數
# people2 = People("成年人")
# 創建類的實例
people = People()
# 調用類的公共屬性和方法
people.name = "成年人"
people.do('只看利弊')
people.name = "小孩子"
people.do('才分對錯')
輸出結果:
調用默認構造函數
成年人只看利弊
小孩子才分對錯
4、總結
私有屬性或方法都有兩個下劃線開頭__;
創建實例通過:類名(),與java相比沒有new 關鍵字;
Python類的用法上與Java非常類似。
其中我們看到 self 關鍵字,在類中定義一個私有或者公有的方法,需要指定第一個參數爲self,self指類本身,類似java的this關鍵字,其中self這個參數名是可以修改的,如改成self2,self3等,但不建議這麼做,因爲Python一般都約定爲此參數名爲self。