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
Python 类中的"静态"成员变量的更多相关文章
- 第8.34节 《Python类中常用的特殊变量和方法》总结
本章介绍了Python类中常用的特殊变量和方法,这些特殊变量和方法都有特殊的用途,是Python强大功能的基石之一,许多功能非常有Python特色.由于Python中一切皆对象,理解这些特殊变量和方法 ...
- 第8章 Python类中常用的特殊变量和方法目录
第8章 Python类中常用的特殊变量和方法 第8.1节 Python类的构造方法__init__深入剖析:语法释义 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解 第8. ...
- C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法
有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同.这些特殊的类型的成员变量包括: a.引用 b.常量 c.静态 d.静态常量(整型) e.静态常量(非整型) 常量和引 ...
- java类中的static成员变量和static方法简单介绍,持续补充
一.静态成员变量 1.属于整个类而不是某个对象实例,所以可以直接通过类名和对象名去调用. 2.静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载才会进行资源回收 二.静态方 ...
- Python 类中方法的内部变量,命名加'self.'变成 self.xxx 和不加直接 xxx 的区别
先看两个类的方法: >>> class nc(): def __init__(self): self.name ='tester' #name变量加self >>> ...
- Java继承关系的父子类中相同的成员变量
最近又重温了一遍<java编程思想>,在看的过程中产生一个想法,java中继承关系的父子类,相同的方法会被重写,那相同的变量会怎样呢? 答案是变量没有重写之说,如果子类声明了跟父类一样的变 ...
- 第八章 Python类中常用的特殊变量和方法
上章花了近三十章节介绍类的知识,本章估计内容也比较多,讲完这些,其实还有更多.为什么这么多类有关的知识呢,这是因为在Python里面一切皆对象,就连整型.浮点数.字符串这些比较常规的类型都是作为类来实 ...
- C++ 类中的引用成员变量初始化
刚遇到一个问题,需要的类成员为指针的引用,而引用不能在构造函数里初始化,必须在初始化列表中进行初始化,并且需要该引用在构造函数中的形参必须为引用形式 1: class ThreadParam { 2: ...
- 『无为则无心』Python面向对象 — 51、私有成员变量(类中数据的封装)
目录 1.私有成员变量介绍 (1)私有成员变量概念 (2)私有成员变量特点 (3)私有成员变量体验 2.属性私有化工作原理 3.定义成员变量的标识符规范 4.私有成员变量的获取和设置方式 1.私有成员 ...
随机推荐
- 基于元胞自动机NaSch模型的多车道手动-自动混合驾驶仿真模型的Matlab实现
模型的建立基本来自于:http://www.doc88.com/p-2078634086043.html 花了一天半的时间用新学会的matlab实现了一下. ───────────────────── ...
- CSS垂直导航栏
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Oracle体系结构之数据库启动的不同状态
数据库启动的不同状态: nomount状态:spfile和plile mount状态:control file open状态:data file和redo file 启动数据库的过程:nomount状 ...
- 东哥讲义2 - 基于TCP,UDP协议的攻击,分析与防护
TCP SYN FLOOD 攻击 正常的TCP三次握手过程: 处于SYN FLOOD攻击状态时的三次握手过程: 查看示例:x_syn.c文件,一个实现了自定义mac,ip,tcp头部的syn floo ...
- css3的一个小demo(箭头hover变化)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- router-link params传参
1.router.js配置 需要在路径后定义上要传的属性名 --> /:属性名(query方式不需要) { path: '/CreateProgress/:name1', name: ...
- 洛谷P2657 windy数 [SCOI2009] 数位dp
正解:数位dp 解题报告: 传送门! 这题一看就是个数位dp鸭,"不含前导零且相邻两个数字之差至少为2"这种的 然后就直接套板子鸭(板子戳总结,懒得放链接辣QAQ 然后就是套路 然 ...
- MySQL事务隔离级别详解(转)
原文: http://xm-king.iteye.com/blog/770721 SQL标准对事务定义了4种隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔 ...
- Git:pull --rebase 和 merge --no-ff
首先是吐嘈 如果你正在 code review,看到上图(下文将称之为:提交线图)之后,特别是像我这样有某种洁癖的人,是否感觉特别难受?如果是的话,请看下文吧 :) 为什么 Git 作为分布式版本控制 ...
- Python 使用ctypes调用 C 函数
在python中通过ctypes可以直接调用c的函数,非常简单易用 下面就一步一步解释用法吧,以Linux为例讲解. 1, 首先确定你的python支持不支持ctypes python2.7以后cty ...