Python類的定義和使用詳情

1.基礎概念

在面向對象的程序設計過程中有兩個重要概念:類(class)和對象(object,也被稱為實例,instance),其中類是某一批對象的抽象,可以把類理解成某種概念;對象才是一個具體存在的實體。從這個意義上看,日常所說的人,其實都是人的對象,而不是人類。

Python 定義類的簡單語法如下:

class 類名:
    執行語句…
    零個到多個類變量…
    零個到多個方法…

類名隻要是一個合法的標識符即可,但這僅僅滿足的是 Python 的語法要求:如果從程序的可讀性方面來看,Python 的類名必須是由一個或多個有意義的單詞連綴而成的,每個單詞首字母大寫,其他字母全部小寫,單詞與單詞之間不要使用任何分隔符。

從上面定義來看,Python 的類定義有點像函數定義,都是以冒號(:)作為類體的開始,以統一縮進的部分作為類體的。區別隻是函數定義使用 def 關鍵字,而類定義則使用 class 關鍵字。

Python 的類定義由類頭(指 class 關鍵字和類名部分)和統一縮進的類體構成,在類體中最主要的兩個成員就是類變量和方法。如果不為類定義任何類變量和方法,那麼這個類就相當於一個空類,如果空類不需要其他可執行語句,則可使用 pass 語句作為占位符。

例如,如下類定義是允許的:

class Empty:
    pass

通常來說,空類沒有太大的實際意義。

類中各成員之間的定義順序沒有任何影響,各成員之間可以相互調用。

Python 類所包含的最重要的兩個成員就是變量和方法,其中類變量屬於類本身,用於定義該類本身所包含的狀態數據:而實例變量則屬於該類的對象,用於定義對象所包含的狀態數據:方法則用於定義該類的對象的行為或功能實現。

Python 是一門動態語言,因此它的類所包含的類變量可以動態增加或刪除(程序在類體中為新變量賦值就是增加類變量),程序也可在任何地方為已有的類增加變量;程序可通過 del 語句刪除己有類的類變量。

類似的是,Python 對象的實例變量也可以動態增加或刪除(隻要對新實例變量賦值就是增加實例變量),因此程序可以在任何地方為己有的對象增加實例變量;程序可通過 del 語句刪除已有對象的實例變量。

在類中定義的方法默認是實例方法,定義實例方法的方法與定義函數的方法基本相同,隻是實例方法的第一個參數會被綁定到方法的調用者(該類的實例),因此實例方法至少應該定義一個參數,該參數通常會被命名為 self。

註意:實例方法的第一個參數並不一定要叫 self,其實完全可以叫任意參數名,隻是約定俗成地把該參數命名為 self,這樣具有最好的可讀性。

在實例方法中有一個特別的方法:__init__,這個方法被稱為構造方法。構造方法用於構造該類的對象,Python 通過調用構造方法返回該類的對象(無須使用 new)。
Python 中很多這種以雙下劃線開頭、雙下劃線結尾的方法,都具有特殊的意義,本教程後面還會詳細介紹這些特殊的方法。

構造方法是一個類創建對象的根本途徑,因此 Python 還提供瞭一個功能:如果開發者沒有為該類定義任何構造方法,那麼 Python 會自動為該類定義一個隻包含一個 self 參數的默認的構造方法。

2.定義一個 Person 類

下面程序將定義一個 Person 類:

class Person :
    '這是一個學習Python定義的一個Person類'
    # 下面定義瞭一個類變量
    hair = 'black'
    def __init__(self, name = 'Charlie', age=8):
        # 下面為Person對象增加2個實例變量
        self.name = name
        self.age = age
    # 下面定義瞭一個say方法
    def say(self, content):
        print(content)

上面的 Person 類代碼定義瞭一個構造方法,該構造方法隻是方法名比較特殊:__init__,該方法的第一個參數同樣是 self,被綁定到構造方法初始化的對象。

與函數類似的是,Python 也允許為類定義說明文檔,該文檔同樣被放在類聲明之後、類體之前,如上面程序中第二行的字符串所示。

在定義類之後,接下來即可使用該類瞭。

Python 的類大致有如下作用:

  • 定義變量;
  • 創建對象;
  • 派生子類;

3.類定義

# coding:utf-8

if __name__ == '__main__':

    '''
    定義:class 類名(object):
           類屬性,方法等......
    實例化: 類名(無參|參數......)
    '''
    class A(object):
        pass
    a = A()
    print(a)  # <__main__.A object at 0x00D9DD50>

4.類方法定義

# coding:utf-8

if __name__ == '__main__':

    '''
    定義:通過def + 方法名(self,參數1,參數2......) self是必須的
    調用:object.方法名(參數1,參數2......)
    '''
    class B(object):
        sex = 'man'
        def talk(self, name):
            print(name)
    b = B()
    b.talk('ok')  # ok

5.類的繼承

# coding:utf-8

if __name__ == '__main__':

    '''
    在聲明類的時候指定這個類繼承哪些類
    class 類名(extend1,extend2.......):
       屬性,方法......
    extend1,extend2 代表要繼承的類。可以一次性繼承多個類
    繼承順序為從左到右,如果繼承的方法或屬性重復,以先繼承的為主
    class.__mro__ 查看類的繼承鏈
    '''
    class C(object):
        sex = 'woman'

        def see(self, name):
            print(f'看{name}')

        def talk(self, name):
            print(f'說{name}')

    class D(B, C):
          pass

    d = D()
    d.talk('yes')  # yes 不是 說yes  以先繼承的為主
    d.see('書')  # 看書
    print(d.sex)  # man 不是 woman  以先繼承的為主
    print(D.__mro__)  # (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>)

6.類的公有,私有

# coding:utf-8

if __name__ == '__main__':

    '''
    私有屬性定義: __+變量名
    私有方法定義: __+函數名(self,參數1,參數2......)
    私有外部無法訪問,隻能內部訪問。但是私有屬性可以在外部通過object._+類名__+變量名 強制訪問
    '''
    class E(object):
        __name = 'xie'
        sex = 'man'

        def __talk(self, name):
            print(name)

        def run(self):
            self.__talk('ok')

        def dp(self):
            print(self.__name)

    e = E()
    # print(e.__name) Error 外部無法訪問私有屬性 D
    print(e.sex)  # man
    # e.__talk('yes') Error 外部無法訪問私有方法
    # object._+類名__+變量名 強制訪問
    print(e._E__name)  # xie
    e.run()  # ok
    e.dp()  # xie

7.子類調用父類的方法

# coding:utf-8

if __name__ == '__main__':

    '''
    通過super().方法(參數1,參數2......)調用,該用法要求python版本3以上
    或
    supper(子類名,self).方法(參數1,參數2......)
    '''
    class F(object):
        def talk(self, name):
            print(f'super name is {name}')

    class G(F):
        def talk(self, children_name, super_name):
            self.print_children_name(children_name)
            super().talk(super_name)

        def talk2(self, children_name, super_name):
            self.print_children_name(children_name)
            super(G, self).talk(super_name)

        def print_children_name(self, name):
            print(f'children name is {name}')


    g = G()
    g.talk('小明', '大明')  # children name is 小明 super name is 大明
    g.talk2('小明', '大明')  # children name is 小明 super name is 大明

到此這篇關於Python類的定義與使用詳情的文章就介紹到這瞭,更多相關Python類的定義與使用內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: