類別

1、定義類別

類別定義語法格式如下:

class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>

一個類別也是由屬性和方法組成的,有些時候我們定義類別的時候需要設定類別的屬性,因此這就需要建構函

類別的建構子如下:

def __init__(self,[...):

類別定義了init() 方法的話,類別的實例化操作會自動調用init() 方法。

那麼如建構函數相對應的是析構函數,理所當然,一個類別創建的時候我們可以用過建構函數來設定屬性,那麼當一個類別銷毀的時候,就會呼叫析構函數。

析構函數語法如下:

def __del__(self,[...):

仔細觀察的童鞋都會發現,類別的方法與普通的函數有一個特別的區別,它們必須有一個額外的第一個參數名稱, 按照慣例它的名稱是self。

那麼這個 self 代表什麼呢?

我們可以看下實例,透過實例來找出答案:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
class Test:
    def prt(self):
        print(self)
        print(self.__class__)
t = Test()
t.prt()

觀察輸出的結果:

776927ef1b515b00d2ff42650fd27f4.png從執行結果可以很明顯的看出, self 代表的是類別的實例,輸出的是目前物件的位址,而self.__class__ 則指向類別。

當然 self 不是 python 關鍵字,也就是說我們把他換成其他的字元也是可以正常執行的。只不過我們習慣使用self

2、Python 定義類別的歷史遺留問題

Python 在版本的迭代中,有一個關於類的歷史遺留問題,就是新式類別和舊式類別的問題,具體先看以下的程式碼:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# 旧式类
class OldClass:
    pass
# 新式类
class NewClass(object):
    pass

可以看到,這裡使用了兩者中不同的方式定義類,可以看到最大的不同就是,新式類別繼承了object 類,在Python2 中,我們定義類別的時候最好定義新式類,當然在Python3 中不存在這個問題了,因為Python3 中所有類別都是新式類別。

那麼新式類別和舊式類別有什麼差別呢?

運行下下面的那段程式碼:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# 旧式类
class OldClass:
    def __init__(self, account, name):
        self.account = account;
        self.name = name;
# 新式类
class NewClass(object):
    def __init__(self, account, name):
        self.account = account;
        self.name = name;
if __name__ == '__main__':
    old_class = OldClass(111111, 'OldClass')
    print(old_class)
    print(type(old_class))
    print(dir(old_class))
    print('\n')
    new_class=NewClass(222222,'NewClass')
    print(new_class)
    print(type(new_class))
    print(dir(new_class))

仔細觀察輸出的結果,比較一下,就能觀察出來,注意喔,Pyhton3 中輸出的結果是一模一樣的,因為Python3 中沒有新式類舊式類別的問題。

繼續學習