zoukankan      html  css  js  c++  java
  • Python 类中的"静态"成员变量

    本文环境:Python 2.7 

    一个类的三个对象实例的属性被同时修改

    有段代码如下:

    class task_queue:
        queue=[]
        
        def append(self,obj):
            self.queue.append(obj)
            
        def print_queue(self):
            print self.queue
            
    
    if __name__=="__main__":
        a=task_queue()
        b=task_queue()
        c=task_queue()
        
        a.append('tc_1')
        
        a.print_queue()
        b.print_queue()
        c.print_queue()

    我们期望在队列 a 中插入 tc_1,结果 b 和 c 也被同时操作了,这并不是我们所期望的

    ['tc_1']
    ['tc_1']
    ['tc_1']

    static

    这种行为很像静态变量的行为,可是 Python 中并没有 static 关键字,这是怎么回事?

    Java 和 C++ 中的 static 关键字有多种用法

    其中,如果 static 去修饰一个类的属性,那么该属性就不是被各个对象所持有,而是一片公共的区域

    利用这种方法,我们可以在构造函数中对一个静态变量 ++ 以查看它被实例化了多少次

    class a(){
        static private count  
        public a(){
            this.count++
        }
        public static instance_count(){
            System.out.println(this.count)
        }
    }

    回到 Python

    Python 中并没有访问限定符 static,这种机制在 Python 中被称为 类的属性 和 对象的属性

    第一段代码中的 queue 在类的声明中被初始化为空,这是 类的属性

    a.append() 之后,queue 中添加了 'tc_1',而 b 和 c 获取的 queue 依然是公共的 类的属性

    如何让这个属性变为对象自己的呢?改动如下:

    class task_queue:
        
        def __init__(self):
            self.queue=[]
        
        def append(self,obj):
            self.queue.append(obj)
            
        def print_queue(self):
            print self.queue

    在构造对象实例时构造对象自己的属性 queue

    ['tc_1']
    []
    []

    另一个例子

    class a():  
        num = 0  
    
    if __name__=="__main__":
        
        obj1 = a()  
        obj2 = a()   
        print obj1.num, obj2.num, a.num   
              
        obj1.num += 1  
        print obj1.num, obj2.num, a.num     
          
        a.num += 2  
        print obj1.num, obj2.num, a.num   

    实例化 obj1 和 obj2 的时候,他们都没有对属性 num 进行操作,所以打印出来的都是类 a 的属性 num,也就是 0

    后来 obj1 对自己的 num 进行 +1 之后,与类的属性脱离了关系,属性 num 就变成对象 obj1 自己的属性,而 obj2 尝试打印属性 num 的时候还是从类的属性中去读取

    第三段中,类的属性 +2 后,obj1.num 没有受到影响,而 obj2 尝试读取 num 属性时,依旧从类中去拿,所以它拿到的 num 是2

    0 0 0
    1 0 0
    1 2 2
  • 相关阅读:
    Kafka 生产者 自定义分区策略
    同步互斥
    poj 1562 Oil Deposits(dfs)
    poj 2386 Lake Counting(dfs)
    poj 1915 KnightMoves(bfs)
    poj 1664 放苹果(dfs)
    poj 1543 Perfect Cubes (暴搜)
    poj 1166 The Clocks (暴搜)
    poj 3126 Prime Path(bfs)
    处理机调度
  • 原文地址:https://www.cnblogs.com/turtle-fly/p/3280610.html
Copyright © 2011-2022 走看看