1.概述
可以发现:python的类变量和C++的静态变量不同,并不是由类的所有对象共享。 类本身拥有自己的类变量(保存在内存),当一个TestClass类的对象被构造时, 会将当前类变量拷贝一份给这个对象,当前类变量的值是多少,这个对象拷贝得到的类变量的值就是多少;而且,通过对象来修改类变量,并不会影响其他对象的类变量的值 ,因为大家都有各自的副本,更不会影响类本身所拥有的那个类变量的值;只有类自己才能改变类本身拥有的类变量的值。
class TestClass(object): # 类变量 val1 = 100 def __init__(self): # 成员变量 self.val2 = 200 def fcn(self, val=400): val3 = 300 self.val4 = val self.val5 = 500 inst = TestClass() print(TestClass.val1) # 100 print(inst.val1) # 100 print(inst.val2) # 200 # print(inst.val3) # AttributeError: 'TestClass' object has no attribute 'val3' # print(inst.val4) # AttributeError: 'TestClass' object has no attribute 'val4' # print(inst.val5) # AttributeError: 'TestClass' object has no attribute 'val5'
inst访问不到val3、val4、val5
inst1 = TestClass() inst2 = TestClass() print(TestClass.val1) # 100 print(inst1.val1) # 100 inst1.val1 = 1000 print(inst1.val1) # 1000 print(TestClass.val1) # 100 print(inst2.val1) # 100 # inst2.val1=22222 TestClass.val1 = 2000 # 只有类自己才能改变类本身拥有的类变量的值。 print(inst2.val1) # 2000 没有重新赋值,跟类变量保存一致 print(TestClass.val1) # 2000 print(inst1.val1) # 1000 被重新赋值后,就跟类变量没关系了 inst3 = TestClass() print(inst3.val1) # 2000
类方法的作用:(不依赖于对象)
因为只能访问类属性和类方法,所以,可以在对象创建之前如果需要做一些功能(动作),就可以放在类方法中
私有属性只能通过类方法,在类内部进行访问
静态方法:很类似类方法
1.需要装饰器@staticmethod
2.静态方法是无需传递参数(如,cls,self)
3.静态方法里面也只能访问类的属性和方法,而对象的属性和方法是无法访问的(即,用self.xx访问属性和访问方法是不可以的)
4.加载时机同类方法,即在对象还没有创建时,就已经加载了
选D