【python學習-5】面向對象的python
python是一種面向對象的編程語言,雖然與C++一樣,支持面向過程的程序設計,python完全可以使用函數、模塊等方式來完成工作,但是當使用python編寫一個較大的項目時,則應該考慮使用面向對象的方法,以便於更好地對項目進行管理。
1、python的類特性:
① 類的抽象性:類是對具有共同方法和屬性的一類對象的描述。
② 類的封裝性:類將屬性和方法封裝,外部是不可見的,只有通過類提供的接口才能與屬於類的的實例對象進行信息交換。
③ 類的繼承性:類可以由已有的類派生,派生出來的類擁有父類方法和屬性。
④ 類的多態性:類可以根據不同的參數類型調用不同的方法,同一個方法可以處理不同類型的參數。
在python中, 對象概念比較廣泛,對象不一定就是類的實例。python的內置數據類型如字符串、列表、字典等,都不是類,但卻具有一些和類相似的語法。
2、類的定義和使用:
類的定義如下:
class <類名>:
<語句1>
<語句2>
...
<語句n>
class <類名>(父類名):
<語句1>
<語句2>
...
<語句n>
上面兩種定義方式,第一種是沒有繼承關系的,第二種是繼承了父類的,在類名後面的圓括號裏面加上父類的名字就行。
類內部與函數內部一樣,相當於一個局部作用域,不同類的內部可以使用相同的屬性名。
雖然類首先需要實例化,然後才能使用其屬性。但實際上當創建一個類以後就可以通過類名訪問其屬性了。如果直接使用類名修改其屬性,那麽將影響已經通過該類實例化的其他對象。
#!/usr/bin/python class animal: name = "animal"; num = 1; class human(animal): name = "human"; age = 99; h = human(); # python 沒有java的toString機制,所以不同類型的數據相加需要轉化print( h.name + ‘,‘ + str(h.num) ); # human,1 human.name = ‘new human‘; # 改變類的name屬性 print(h.name); # 實例h中並沒有修改name的值,所以默認使用的是類的name值,值變了:new human h.name = ‘human h‘; # 實例h中修改了name的值 print(h.name); # human h human.name = ‘new human2‘; print(h.name); # 實例h中並修改了name的值,雖然類的name值變了,但h.name還是:human h h2 = human(); # 第二個實例 print(h2.name); # 新建的對象,name屬性是:new human2
3、類的私有屬性和方法
類的外部可以設置其屬性的值,在某些情況下,我們不希望在類外部對其進行操作,所以就有了私有屬性。
python的私有屬性不是通過關鍵字控制的,而是通過變量名控制的:變量名以雙下劃線開始的變量,是私有屬性,如 __myAttr ; 如果在類內部方法中訪問私有屬性,應該加上self,如:self.__myAttr 。
定義類的方法,與函數定義十分相似,也是使用def 定義的,但是和函數有一點區別是,類的方法,入參的第一個需要是 self 。
類的私有方法與私有屬性一樣,只能在類內部使用,名稱是以雙下劃線開頭的,類內部調用私有方法,要使用 “ self.私有方法名 ” 的形式調用。
#!/usr/bin/python class animal: name = "animal"; num = 1; __nickName = "Some thing just like this"; # 類私有屬性 def __getNickName(self): # 類私有方法 return self.__nickName; def showNickName(self): # 類對外提供的方法 print("I have a NickName:" + self.__getNickName() ); def showNickNameAbc(self,abc): # 類對外提供的方法 self.showNickName(); print("this is a secret:" + str(abc) ); def addNum(self,*nums): # 類對外提供的方法,任意個數參數 result = 0; for i in nums: result += i; return result; a = animal(); # print(a.__nickName); # 報錯:AttributeError: ‘animal‘ object has no attribute ‘__nickName‘ # print(a.__getNickName()); # 報錯:AttributeError: ‘animal‘ object has no attribute ‘__getNickName‘ a.showNickName(); print(a.addNum(1,2,3,4,5)); a.showNickNameAbc(‘Mike‘);
4、類的專有方法
在python中,類中有一些以雙下劃線開始並且以雙下劃線結束的方法,我們稱之為類的專有方法,比如 __init__ 方法是類實例化的時候調用的。
__init__ 構造函數,生成對象時調用
__del__ 析構函數,釋放對象時調用
__add__ 加運算
__mul__ 乘運算
__cmp__ 比較運算
__repr__ 打印,轉換
__setitem__ 按照索引賦值
__getitem__ 按照索引獲取值
__len__ 獲取長度
__call__ 函數調用
#!/usr/bin/python class animal: name = "animal"; num = 1; __nickName = "Some thing just like this"; # 類私有屬性 def __getNickName(self): # 類私有方法 return self.__nickName; def showNickName(self): # 類對外提供的方法 print("I have a NickName:" + self.__getNickName() ); def __init__(self,nickName): # 類構造方法 self.__nickName = nickName; a = animal(‘Mike‘); a.showNickName();
5、類的繼承
前面已經提到類的繼承了,新類可以繼承父類的公用屬性和共有方法,但是不能繼承父類的私有屬性和私有方法。
python的類繼承是多繼承,一個類可以繼承多個類,格式如下:
class 新類名(父類1,父類2,...,父類n): <語句1> <語句2> ... <語句n>
6、類中重載方法和運算符
繼承父類之後,避免重命名函數,可以使用方法的重載來解決
#!/usr/bin/python class animal: name = "animal"; num = 1; def show(self): # 類對外提供的方法 print(self.name); print(self.num); class human(animal): name = "human"; age = 100; def show(self): # 重載方法 animal.show(self); print(self.age); h = human(); h.show();
運算符重載,對應的是類的專有方法:
+ __add__
- __sub__
* __mul__
/ __div__
% __mod__
** __pow__
#!/usr/bin/python class animal: name = "animal"; num = 1; def show(self): # 類對外提供的方法 print(self.name); print(self.num); def __add__(self,n): self.num += n; h = animal(); h.show(); h+5; # 調用 __add__ 方法 h.show();
可以在模塊中定義類,在訪問的類時候,就使用 “ 模塊名.類名 ” 對類進行調用。
【python學習-5】面向對象的python