1. 程式人生 > >【python學習-5】面向對象的python

【python學習-5】面向對象的python

usr 私有 運算 .sh __call__ pre style ring 控制

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