http://www.jb51.net/article/54286.htm
http://blog.csdn.net/a123456ei/article/details/24347857
class TestClass(object):
val1 = 100def __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 inst.val2
#print inst.val3 #'TestClass' object has no attribute 'val3'
#print inst.val4 #'TestClass' object has no attribute 'val4'
#print inst.val5 #'TestClass' object has no attribute 'val5'
'''
这里,val1是类变量,可以由类名直接调用,也可以有对象来调用;
val2是成员变量,可以由类的对象来调用,这里可以看出成员变量一定是以self.的形式给出的,因为self的含义就是代表实例对象;
val3不是成员变量,它只是函数fcn内部的局部变量;
val4和val5也都不是成员变量,虽是以self.给出,但并没有在构造函数中初始化
'''
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
TestClass.val1 = 2000
print inst2.val1 # 2000
print TestClass.val1 # 2000
print inst1.val1 # 1000 ??????????
inst3 = TestClass()
print inst3.val1 # 2000
'''
可以发现:python的类变量和C++的静态变量不同,并不是由类的所有对象共享。
类本身拥有自己的类变量(保存在内存),当一个TestClass类的对象被构造时,
会将当前类变量拷贝一份给这个对象,当前类变量的值是多少,这个对象拷贝得到的类
变量的值就是多少;而且,通过对象来修改类变量,并不会影响其他对象的类变量的值
,因为大家都有各自的副本,更不会影响类本身所拥有的那个类变量的值;只有类自己
才能改变类本身拥有的类变量的值。
'''
========================================================================================================
# -*- coding: utf-8 -*-
class Tools():
#---------------------------线程锁---------------------------------------------------
number = 0
innum = 10
def __init__(self, config):
#self.logFilePath()
print 'tools class'
@staticmethod
def getStaticNumber():
Tools.number += 1
return Tools.number + Tools.innum #但是无法访问:self.innum,即实例属性
@classmethod
def getClassNumber(cls):
cls.number += 2
return cls.number #但是无法访问:self.innum,即实例属性
def getNumber(self):
self.number += 3
return self.number
if __name__ == '__main__':
print Tools.getClassNumber() # 2
print Tools.getStaticNumber() # 13
tool = Tools(1)
print 'object'
print tool.number # 3
print tool.getNumber() # 6 实例的函数并不能改变静态变量的值,但可以被静态变量赋值,不过它被赋值的时刻只有该实例被创建
#print tool.getNumber() 和被以一次使用时被静态变量赋值,而其他时候不被赋值
print tool.getStaticNumber() # 14
print tool.getClassNumber() # 6
print Tools.getClassNumber() # 8
print Tools.getStaticNumber() # 19
print Tools.getClassNumber() # 11
print 'object'
print tool.number # 6
print tool.getNumber() # 9
tool = Tools(1)
print tool.number # 11
#print tool.getNumber()
print tool.getStaticNumber() # 22
print tool.getClassNumber() # 14
print Tools.getClassNumber() # 16
print Tools.getStaticNumber() # 27
print Tools.getClassNumber() # 19
print tool.number # 19
print tool.getNumber() # 22
print Tools.getClassNumber() # 21
print Tools.getStaticNumber() # 32
print Tools.getStaticNumber() # 33
print Tools.getClassNumber() # 25
print tool.number # 22
print tool.getNumber() # 25