python中的静态属性,静态方法、类方法解读

时间:2021-03-23 19:27:55

http://www.jb51.net/article/54286.htm

http://blog.csdn.net/a123456ei/article/details/24347857

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 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