HOWTO · Python
在 Python 中定义类全局变量
学习在类主体中定义 Python 类属性、用 ClassName.attribute 访问它,并将它与用 global 声明的模块级名称区分开来。
本页内容
Python 类变量是在类主体中赋值的属性。只需在类上定义一次,之后即可通过 ClassName.attribute 读取,例如 Tesla.speed。global 名称则不同:它属于模块命名空间,不会成为类属性。
在 Python 中定义类变量
在类主体中为变量赋值,然后通过类名读取。示例还展示了一个方法和另一个类如何读取同一属性。
class Tesla:
speed = 60
def show_speed(self):
return Tesla.speed
class Dashboard:
def show_tesla_speed(self):
return Tesla.speed
print(Tesla.speed)
print(Tesla().show_speed())
print(Dashboard().show_tesla_speed())
60
60
60
这里,speed 存储在 Tesla 上,因此 Tesla.speed 读取的是共享的类属性。Tesla 中的方法和 Dashboard 中的方法都使用相同的类限定查找方式。
在类外部访问类变量
只要能访问该类,就可以在任何位置使用 ClassName.attribute。例如,在模块级代码和另一个类的方法中,都可以使用 Tesla.speed。读取类属性不需要创建实例。类外部的裸名称(例如 speed)并不指向 Tesla.speed;Python 会在当前作用域中查找它,而该名称可能未定义。
实例也可以定义同名属性。例如,car.speed = 80 会在特定的 car 实例上设置属性,而 Tesla.speed 仍然指向类属性。如果需要的是共享值,请使用带类名的形式。
为什么 global 不能定义类变量
global 语句告诉 Python,在代码块中对裸名称赋值时,应将该名称绑定到模块命名空间。在类主体中,global speed 后跟 speed = 60 会创建或更新模块级名称 speed,而不会给 Tesla.speed 赋值。若要定义类变量,应在类主体中直接赋值,例如 speed = 60,不要使用 global;在类外部则通过 Tesla.speed 访问它。
需要访问类属性的方法也可以使用 Tesla.speed。如果方法需要适用于子类,可根据预期的查找行为使用 type(self).speed 或 self.speed;self.speed 可能会解析到遮蔽类属性的实例属性。