热门问题
时间线
聊天
视角

類別變數 (電腦科學)

来自维基百科,自由的百科全书

Remove ads

以類別為基礎物件導向程式設計裡,類別變數(class variable)是定義在類別裡的變數,不論類別存在多少實例,同個類別的類別變數都是一個,不會因為實例數量而有多個變數[1][2][3][4][5]

類別變數不是實例變數英語instance variable(instance variable),是一種特別的類別屬性(或是類別屬性、資料成員)。「類別」和「實例」的差異也可以用在方法(成員函式)上,類別可以有實例方法(instance method),也可以有類別方法。

靜態成員變數和靜態成員函式

有些程式語言中,類別變數和類別方式可能是靜態解析(statically resolved),不是用動態分派方式調用,也有可能是在編譯時配置其記憶體(整個類別只配置一次,如同靜態變數一樣)。而有些語言中,可能上述方式中的一種或全部改為動態方式。例如,若可以在運行時動態定義類別,其成員變數也會在類別定義時動態配置記憶體,另外在一些語言中的類別方法會用動態分派來處理。

因此,在一些語言,靜態成員變數(static member variable)和靜態成員函式(static member function)就是類別變數和類別函式,但不是所有程式語言都是如此。上述的詞常用在JavaC#[5]C++,其中類別變數和類別方法會用static關鍵字宣告,稱為靜態成員變數和靜態成員函式。

範例

C++

struct Request {

    static int count;
    int number;

    Requestobject() {
        number = count; // 修改實例變數 "this->number"
        ++count; // 修改類別變數 "Request::count"
    }

};

int Request::count = 0;

在上述C++範例中,每一次呼叫構造器,類別變數Request::count就會加一,因此Request::count可以記錄請求創建的數量,每一個新請求的物件會循序給予number,數值不會重複。因為count是類別變數,只有一個Request::count物件,相對的,每一個請求的物件都有其自己的number變數。

另外,Request::count只會初始化一次。

Python

class Dog:
    vertebrate_group = "mammals"  # 類別變數

dog_1 = Dog
print(dog_1.vertebrate_group)  # 存取類別變數

上述程式碼的資訊不多,因為在Dog類別中只有一個類別變數,將狗歸類為哺乳動物I。有關類別變數中,可以客制化物件(在此例中,是dog_1),在類別中增加一個或多個實例變數英語instance variable


類別變數也可以透過ClassVar來提示:

from typing import ClassVar

class Dog:
    vertebrate_group: ClassVar[str] = "mammals"

參考資料

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads