热门问题
时间线
聊天
视角
类别变数 (电脑科学)
来自维基百科,自由的百科全书
Remove ads
在以类别为基础、物件导向程式设计里,类别变数(class variable)是定义在类别里的变数,不论类别存在多少实例,同个类别的类别变数都是一个,不会因为实例数量而有多个变数[1][2][3][4][5]
类别变数不是实例变数(instance variable),是一种特别的类别属性(或是类别属性、资料成员)。“类别”和“实例”的差异也可以用在方法(成员函式)上,类别可以有实例方法(instance method),也可以有类别方法。
静态成员变数和静态成员函式
有些程式语言中,类别变数和类别方式可能是静态解析(statically resolved),不是用动态分派方式调用,也有可能是在编译时配置其记忆体(整个类别只配置一次,如同静态变数一样)。而有些语言中,可能上述方式中的一种或全部改为动态方式。例如,若可以在运行时动态定义类别,其成员变数也会在类别定义时动态配置记忆体,另外在一些语言中的类别方法会用动态分派来处理。
因此,在一些语言,静态成员变数(static member variable)和静态成员函式(static member function)就是类别变数和类别函式,但不是所有程式语言都是如此。上述的词常用在Java、C#[5]和C++,其中类别变数和类别方法会用static关键字宣告,称为静态成员变数和静态成员函式。
范例
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只会初始化一次。
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"
参考资料
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads