谨慎修改Python的类属性
Python的类和类实例都是可变对象,可以随时给属性赋值,并且在原处修改。
在对类属性进行修改时需要特别小心,因为所有的类实例都继承共享类属性,除非实例本身存在和类属性同名的属性。对类属性进行修改,会影响到所有由这个类生成的实例。
- class CA(object):
- cls_pre = 'aaaaa'
- def __init__(self):
- self.obj_pre = 'bbbbb'
- a = CA()
- b = CA()
- print(a.cls_pre, a.obj_pre)
- print(b.cls_pre, b.obj_pre)
- CA.cls_pre = 'ccccc'
- c = CA()
- d = CA()
- d.cls_pre = 'ddddd'
- print(a.cls_pre, a.obj_pre)
- print(b.cls_pre, b.obj_pre)
- print(c.cls_pre, c.obj_pre)
- print(d.cls_pre, d.obj_pre)
运行结果:
- aaaaa bbbbb
- aaaaa bbbbb
- ccccc bbbbb
- ccccc bbbbb
- ccccc bbbbb
- ddddd bbbbb
代码中,将类属性CA.cls_pre 重新赋值为 'ccccc'。在修改类属性之后,不仅是后续创建的类实例c的cls_pre发生变化,在修改类属性之前的创建的类实例a、b的类属性cls_pre都发生了变化。
所以,当在class语句外修改类属性时,会导致所有由这个类创建的实例的类属性都随之变化,因为所有的实例都共享类属性CA.cls_pre。除非实例本身有同名的实例属性对类属性进行了覆盖,比如代码中的d.cls_pre = 'ddddd'。
谨慎修改Python的类属性的更多相关文章
- python 添加类属性
类属性必须赋值. 创建类属性 类是模板,而实例则是根据类创建的对象. 绑定在一个实例上的属性不会影响其他实例,但是,类本身也是一个对象,如果在类上绑定一个属性,则所有实例都可以访问类的属性,并且,所有 ...
- JavaScript 修改 CSS 伪类属性
背景 有时候我们希望通过JS代码控制伪类属性, 确苦于对策 实际上可通过向document.head中添加style子元素来实现 演示 function css(style_text) { var s ...
- Python面向对象—类属性和实例属性
属性:就是属于一个对象的数据或函数元素 类有类方法.实例方法.静态方法.类数据属性(类变量)和实例数据属性(实例变量). 类属性:包括类方法和类变量,可以通过类或实例来访问,只能通过类来修改. 实例属 ...
- python的类属性、实例属性、类方法、静态方法
类属性 就像如下代码: class Person: name = "张三" # 共有类属性 __age = 18 # 私有类属性 在类中直接定义的属性就是类属性,它被所有的实例对象 ...
- python干货-类属性和方法,类的方法重写
类属性与方法 类的私有属性 __private_attrs: 两个下划线开头,表明为私有,外部不可用,内部使用时self.__private_attrs. 类的方法 在类的内部,使用 def 关键字来 ...
- Python:类属性,实例属性,私有属性与静态方法,类方法,实例方法
From: http://www.cnblogs.com/pengsixiong/p/4823473.html 属性分为实例属性与类属性 方法分为普通方法,类方法,静态方法 一:属性: 尽量把需要用户 ...
- python学习-类属性和实例属性
#类属性和实例属性 class Tool(object): #类属性 total = 0 #静态方法 @classmethod def say(self): print("hello wor ...
- Python面向对象 | 类属性
property property是一个装饰器函数,可以将一个方法伪装成属性,调用的时候可以不用加().@property被装饰的方法,是不能传参数的,因为它伪装成属性了. 装饰器的使用:在要装饰的函 ...
- python限定类属性的类属性:__slots__
__slots__ 由于Python是动态语言,任何实例在运行期都可以动态地添加属性. 如果要限制添加的属性,例如,Student类只允许添加 name.gender和score 这3个属性,就可以利 ...
随机推荐
- Redis在Linux安装详细步骤
一.准备环境: 1.VMware 2.CentOS 3.redis-3.0.4.tar.gz 4.下载地址 Http://redis.io/ 英文版 Http://www.redis.cn/ 中 ...
- linux工作中遇到的问题总结---更新中
今天这个,严格来说不算一篇文章,我只想把我工作中遇到的问题分享给大家,让大家少犯错误. 1.安装rmp包时出现错误 :header V3 DSA signature: nokey ,key id .. ...
- C++ size_t 和size_type的区别
为了使自己的程序有很好的移植性,c++程序员应该尽量使用size_t和size_type而不是int, unsigned size_t是全局定义的类型:size_type是STL类中定义的类型属性,用 ...
- Ali RocketMQ与Kafka对照
淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysql作为消息存储媒介.可全然水平扩容,为了进一步减少成本.我们觉得存储部分能够进一步优化,2011年初,Linkin开源了Kaf ...
- Maven依赖的是本地工程还是仓库jar包?
相信大家都碰见过maven配置的依赖或者是jar包或者是工程,在开发的过程当中,我们当然需要引入的是工程,这样查看maven依赖的文件的时候,就能直接查看到源码. 一.本地工程依赖 举个例子,其架构如 ...
- F04 我的投资策略
我的投资理念:价值投资和右侧趋势投资.我的目标年化收益率: 15-25%我的投资时间:3-5年我的投资品种:股票 + EFT基金 买卖时间点的纪律(买入,卖出的时间原则)股票MA20为界限,高于则持有 ...
- 八、 Spring Boot 过滤器、监听器
直接使用@WebFilter和@WebListener的方式,完成一个Filter 和一个 Listener.过滤器(Filter)文件MyFilter.Javapackage org.springb ...
- freemarker常见语法大全
推荐freemarker系列教程:http://swiftlet.net/archives/category/freemarker FreeMarker的插值有如下两种类型:1,通用插值${expr} ...
- 查询linux版本命令
[环境] Ubuntu [本文命令记录] uname -a lsb_release cat /etc/issue cat /proc/version [截图效果] (1)uname -a (2)lsb ...
- 自学Zabbix3.5.6-监控项item-Value mapping值映射
zabbix为了显示更人性化的数据,在使用过程中,我们可以将获取到得数据映射为一个字符串.比如,我们写脚本监控MySQL是否在运行中, 一般返回0表示数据库挂了,1表示数据库正常,还有各种各样的监控都 ...