天天看點

python類對象和執行個體對象

類對象支援兩種操作:屬性引用和執行個體化。

屬性引用 使用 Python 中所有屬性引用所使用的标準文法: obj.name。 有效的屬性名稱是類對象被建立時存在于類命名空間中的所有名稱。 是以,如果類定義是這樣的:

"""A simple example class"""
    i = 12345

    def f(self):
        return 'hello world'           

那麼 MyClass.i 和 MyClass.f 就是有效的屬性引用,将分别傳回一個整數和一個函數對象。 類屬性也可以被指派,是以可以通過指派來更改 MyClass.i 的值。 doc 也是一個有效的屬性,将傳回所屬類的文檔字元串: "A simple example class"。

類的 執行個體化 是使用函數表示法。 可以相像python類對象就是會傳回一個新的類執行個體的不帶參數的函數。 舉例來說(假設使用上述的類):

建立類的新 執行個體 并将此對象配置設定給局部變量 x。

執行個體化操作(“調用”類對象)會建立一個空對象。 許多類喜歡建立帶有特定初始狀态的自定義執行個體。 為此類定義可能包含一個名為 __init__() 的特殊方法,就像這樣:

self.data = []           

當一個類定義了 __init__() 方法時,類的執行個體化操作會自動為新建立的類執行個體發起調用 __init__()。 是以在這個示例中,可以通過以下語句獲得一個經初始化的新執行個體:

當然,__init__() 方法還可以有額外參數以實作更高靈活性。 在這種情況下,提供給類執行個體化運算符的參數将被傳遞給 __init__()。 例如,:

...     def __init__(self, realpart, imagpart):
...         self.r = realpart
...         self.i = imagpart
...
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)           

執行個體對象

現在我們可以用執行個體對象做什麼?執行個體對象了解的唯一操作是屬性引用。有兩種有效的屬性名稱,資料屬性和方法。

資料屬性 對應于 Smalltalk 中的“執行個體變量”,以及 C++ 中的“資料成員”。 資料屬性不需要聲明;像局部變量一樣,它們将在第一次被指派時産生。 例如,如果 x 是上面建立的 MyClass 的執行個體,則以下代碼段将列印數值 16,且不保留任何追蹤資訊:

while x.counter < 10:
    x.counter = x.counter * 2
print(x.counter)
del x.counter           

另一類執行個體屬性引用稱為 方法。 方法是“從屬于”對象的函數。 在 Python 中,方法這個術語并不是類執行個體所特有的:其他對方也可以有方法。 例如,清單對象具有 append, insert, remove, sort 等方法。 然而,在以下讨論中,我們使用方法一詞将專指類執行個體對象的方法,除非另外顯式地說明。)

執行個體對象的有效方法名稱依賴于其所屬的類。 根據定義,一個類中所有是函數對象的屬性都是定義了其執行個體的相應方法。 是以在我們的示例中,x.f 是有效的方法引用,因為 MyClass.f 是一個函數,而 x.i 不是方法,因為 MyClass.i 不是一個函數。 但是 x.f 與 MyClass.f 并不是一回事 --- 它是一個 方法對象,不是函數對象。