python 的返回值为list 的 property 绕过 setter 的问题
来源:互联网 发布:金正恩 知乎 编辑:程序博客网 时间:2024/06/14 17:44
当用property装饰一个属性,并且这个属性返回的是一个list(或者一个类,一个dict,都会有同样的情况),那么如果我们使用list的索引去访问list,setter将不起任何作用。
如下所示:
In [1]: class test(object): ...: a = [10,10,10] ...: @property ...: def ads(self): ...: print 'get' ...: return self.a ...: @ads.setter ...: def ads(self, val): ...: print 'set' ...: self.a = val ...: In [2]: test = test()In [3]: test.ads[1] = 1getIn [4]: test.adsget
可以看到,全程并没有运行setter(输出没有出现过“set”),而property的值却被改变了。
如果想要防止这种情况的发生,应该对property的值加以判断,如果不是基础类型,就使用深拷贝,能够避免这种情况的发生。
例如:
In [1]: def is_container(val): ...: '''判断一个变量是否为基本的类型,如果是,就意味着可以直接不需要拷贝赋值''' ...: return not type(val) in (int, float, long, complex, str) ...: In [2]: import copy ...: class test(object): ...: a = [10,10,10] ...: @property ...: def ads(self): ...: print 'get' ...: if not is_container(self.a): ...: return self.a ...: else: ...: return copy.deepcopy(self.a) ...: @ads.setter ...: def ads(self, val): ...: print 'set' ...: self.a = val ...: In [3]: test = test()In [4]: test.ads[1] = 1getIn [5]: test.adsgetOut[5]: [10, 10, 10]
0 0
- python 的返回值为list 的 property 绕过 setter 的问题
- java的setter、getter 以及python的@property函数
- c# List find()方法返回值的问题(返回结果为对象的指针)
- property属性的setter、getter方法
- python 7-4 如何创建可管理的对象属性R = property(getRadius,setRadius)或者@property @radius.setter
- iOS中@Property声明的属性同时重写getter和setter方法报错问题
- Object-C @property使用指定的setter和getter
- 令人迷惑的 setter 和 getter 和 @property 和@synthesize
- Setter Semantics即@property中使用的修饰符
- 直接打印返回值为List类型时的错误
- 传值为集合的sql 语句,返回list
- getResourceAsStream返回值为空的问题
- 函数返回值为指针的问题
- startActivityForResult返回值为空的问题
- 绕过offlieimap卡住的问题
- Python返回数组/List长度的方法
- python list 返回索引的方法
- python 的property函数
- 免费数据集下载
- CentOS7搭建NFS服务
- 用cmd开启mysql数据库并建立数据库表
- SniperOJ WEB writeup
- UITableView 重用(dequeueReusableCellWithIdentifier:)
- python 的返回值为list 的 property 绕过 setter 的问题
- c++第五次上机实验
- 史上最清晰易懂的JAVA深克隆和浅克隆讲解
- KMSpico v10.1.7 官方正式版下载【Office2016/Win10激活工具】
- 【模拟】洛谷 P1071 潜伏者
- shape控制每一条边框线,每一个倒角
- 绘图之Canvas学习
- linux 常用指令和中文乱码问题
- Android提取图片的主要颜色作为图片阴影的控件