局部
class TestClass(object): val1 = 100 def __init__(self): self.val2 = 200 def fcn(self,val = 400): val3 = 300 self.val4 = val self.val5 = 500 if __name__ == '__main__': inst = TestClass() print TestClass.val1 print inst.val1
print TestClass.val2 #会报错。类不能访问成员变量 print inst.val2 print inst.val3 #会报错 print inst.val4 #会报错 print inst.val5 #会报错
val1是类变量,可以由类名直接调用,也可以由对象来调用;
val2是成员变量,可以由类的对象来调用,这里可以看出成员变量一定是以self.的形式给出的,因为self的含义就是代表实例对象;如果__init__内的变量没有加self,那就变成一个__init__的局部变量;
val3不是成员变量,它只是函数fcn内部的局部变量;
val4和val5是成员变量,但并没有初始化,所以这里会报错
这个是能正确运行的
class TestClass(object): val1 = 100 def __init__(self): self.val2 = 200 def fcn(self,val = 400): val3 = 300 self.val4 = val self.val5 = 500 def add(self): self.fcn() result = self.val4 + self.val5 return result if __name__ == '__main__': inst = TestClass() print inst.add()
这个是不能正确运行的,因为fcn是对val4,val5初始化,这里没运行fcn就没初始化
class TestClass(object): val1 = 100 def __init__(self): self.val2 = 200 def fcn(self,val = 400): val3 = 300 self.val4 = val self.val5 = 500 def add(self): # self.fcn() result = self.val4 + self.val5 return result if __name__ == '__main__': inst = TestClass() print inst.add()
概括的一个例子
class TestClass(object): val1 = 100 def __init__(self): self.val2 = 200 def fcn(self,val = 400): val3 = 300 self.val4 = val self.val5 = 500 def add(self): self.val4 = 1 self.val5 = 2 result = self.val4 + self.val5 return result if __name__ == '__main__': inst = TestClass() print inst.add() print inst.val4 inst.fcn() print inst.val4
运行出来的结果:
可以看到,只要你对val4,val5初始化了就可以用实例访问,证明这个带self的是成员变量,不是局部变量。运行fcn后,对成员变量的值进行了改变。