热门问题
时间线
聊天
视角

类别变数 (电脑科学)

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

Remove ads

以类别为基础物件导向程式设计里,类别变数(class variable)是定义在类别里的变数,不论类别存在多少实例,同个类别的类别变数都是一个,不会因为实例数量而有多个变数[1][2][3][4][5]

类别变数不是实例变数(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),在类别中增加一个或多个实例变数


类别变数也可以透过ClassVar来提示:

from typing import ClassVar

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

参考资料

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads