在 python 中,无论是类变量还是类方法都是类的属性,每一个类属性都必须绑定到一个类实例或类本身上
绑定到类实例的属性就是类成员属性,绑定到类本身的属性就是类静态属性
类数据属性
类中直接定义的数据属性是绑定到类的,python 中你并不需要在他前面加 static 关键字(事实上,目前为止 python 中并没有一个 static 关键字)
而绑定到实例的类成员变量与类静态变量即使是同名的,也并不会造成冲突,而类成员变量在使用前并不需要提前声明,可以直接设置值并调用
但如果类成员方法试图访问不存在类成员变量,则会继续寻找是否存在同名的类静态变量来使用
如果最终无法找到需要读取的变量,则会抛出异常:AttributeError: 'XXX' object has no attribute 'xxx'
示例
class Test:
str = 'static'
str2 = 'str2'
def setStr(self, i):
self.str = i
def getStr(self):
return self.str
def getStr2(self):
return self.str2
if __name__ == '__main__':
print(Test.str) # 访问类静态变量无需实例化类
test = Test() # 类实例化
test.setStr('local') # 设置类成员变量
print(Test.str) # 访问类静态变量(非类成员变量)
print(test.getStr()) # 访问类成员变量
print(test.getStr2()) # 测试需要访问的类成员变量不存在的情况
执行上述代码,打印出了:static
static
local
str2
可以看到,虽然类静态成员中拥有 str 变量,而类成员方法中试图修改 str 变量
但实际上,这两个 str 变量是不同,因为他们的绑定对象不同,分别绑定到类和实例