本文环境: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

Python 类中的"静态"成员变量的更多相关文章

  1. 第8.34节 《Python类中常用的特殊变量和方法》总结

    本章介绍了Python类中常用的特殊变量和方法,这些特殊变量和方法都有特殊的用途,是Python强大功能的基石之一,许多功能非常有Python特色.由于Python中一切皆对象,理解这些特殊变量和方法 ...

  2. 第8章 Python类中常用的特殊变量和方法目录

    第8章 Python类中常用的特殊变量和方法 第8.1节 Python类的构造方法__init__深入剖析:语法释义 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解 第8. ...

  3. C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法

    有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同.这些特殊的类型的成员变量包括: a.引用 b.常量 c.静态 d.静态常量(整型) e.静态常量(非整型) 常量和引 ...

  4. java类中的static成员变量和static方法简单介绍,持续补充

    一.静态成员变量 1.属于整个类而不是某个对象实例,所以可以直接通过类名和对象名去调用. 2.静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载才会进行资源回收 二.静态方 ...

  5. Python 类中方法的内部变量,命名加'self.'变成 self.xxx 和不加直接 xxx 的区别

    先看两个类的方法: >>> class nc(): def __init__(self): self.name ='tester' #name变量加self >>> ...

  6. Java继承关系的父子类中相同的成员变量

    最近又重温了一遍<java编程思想>,在看的过程中产生一个想法,java中继承关系的父子类,相同的方法会被重写,那相同的变量会怎样呢? 答案是变量没有重写之说,如果子类声明了跟父类一样的变 ...

  7. 第八章 Python类中常用的特殊变量和方法

    上章花了近三十章节介绍类的知识,本章估计内容也比较多,讲完这些,其实还有更多.为什么这么多类有关的知识呢,这是因为在Python里面一切皆对象,就连整型.浮点数.字符串这些比较常规的类型都是作为类来实 ...

  8. C++ 类中的引用成员变量初始化

    刚遇到一个问题,需要的类成员为指针的引用,而引用不能在构造函数里初始化,必须在初始化列表中进行初始化,并且需要该引用在构造函数中的形参必须为引用形式 1: class ThreadParam { 2: ...

  9. 『无为则无心』Python面向对象 — 51、私有成员变量(类中数据的封装)

    目录 1.私有成员变量介绍 (1)私有成员变量概念 (2)私有成员变量特点 (3)私有成员变量体验 2.属性私有化工作原理 3.定义成员变量的标识符规范 4.私有成员变量的获取和设置方式 1.私有成员 ...

随机推荐

  1. spring面试大全

    一.spring如何实现资源管理? 使用 applicationContext.getResource(“classpath:文件名”):在src根目录下,在类路径下 applicationConte ...

  2. Druid在有赞的实践

    转载一篇自己在公司博客上的文章 一.Druid介绍 Druid 是 MetaMarket 公司研发,专为海量数据集上的做高性能 OLAP (OnLine Analysis Processing)而设计 ...

  3. pyAudio介绍

    概要 pyaudio有这么几个功能: - 提取特征 - 训练并且使用分类器 - 语音分割功能 - 内容关系可视化 python实现,好处有这么几个 - 适合做计算分析类型操作(编码少,效率不低) - ...

  4. Oracle备份恢复之逻辑备份

    exp 交互模式:导出scott用户下的emp表. [oracle@localhost ~]$ exp Export: Release 10.2.0.1.0 - Production on Thu N ...

  5. cordova 跨平台APP版本升级

    利用cordova+ionic开发好项目,之后就是打包发布,在这之前,还要做一个版本升级的小功能. 首先我们项目根目录里自然少不了配置:config.xml中 如图.version,我们以后每次升级A ...

  6. C#中DataSet、DataTable、DataReader的区别

    简单说就是:     DataSet:数据集.一般包含多个DataTable,用的时候,dataset["表名"]得到DataTable         DataTable:数据表 ...

  7. 02 - nginx - 反向代理、限速

    一.Nginx反向代理 代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器. 代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务器的硬盘中, ...

  8. libevent 网络IO分析

    libevent 网络IO分析 Table of Contents 1. 简介 2. 简单使用与入门 2.1. 定时器-timeout 超时回调 2.2. 信号事件 2.3. 读取 socket 3. ...

  9. 【Java】第一讲:Java基础

    // 功能:在控制台显示“Hello”// 日期:2017-04-11 // public:表示这个类是公共类,一个java文件中只能有一个public类// class:表示这是一个类// hell ...

  10. sql server中的日期详解使用(convert)

    转自:http://blog.csdn.net/hehe520347/article/details/48496853 有个字段值例如2012-07-02 00:00:00.000 转化成 2012- ...