python语言中为什么说getter和setter用起来很傻,gettersetter,Getter和sette
python语言中为什么说getter和setter用起来很傻,gettersetter,Getter和sette
Getter和setter是坏蛋。坏蛋,魔 鬼!Python对象不是Java Bean。不要写什么getter和setter,然后还把它们包装在“属性”里面。它直到你能证明你需要比一个简单访问复杂一点的功能时才有意义,否 则,不要写getter和setter。它们是CPU时间的浪费,更要紧的是,它们还是程序员宝贵时间的极大浪费。不仅仅对于写代码和测试的人,对于那些 要阅读和理解它们的人也是。
在 Java中,你必须使用getter和setter因为公共字段不允许你以后改变想法再去使用getter和setter。在Python中,这样做很 傻,因为你可以以一个普通特性开始并可以在任何时间改变你的想法,而不用影响到这个类的任何客户。所以不要写getter和setter。
但是当我想设置对象的一个属性时,是用obj.attr=value这样直接赋值么?
但是当我赋值某一个属性attr1时,其他有些关联属性attr2是应该可以自动生成的(通过对attr1的一些操作得到attr2应有的值),如果有setter,那么这个运算的过程可以写在setter里,如果不用setter那这个运算应该在哪里写呢?
谢谢
可以看下python文档里property setter/getter相关部分
import datetime, reDATE_PATTERN = re.compile('^\d+\-\d+\-\d+$')def str_to_date(date): if isinstance(date, datetime.date): return date elif isinstance(date,str) and DATE_PATTERN.match(date): return datetime.date(*map(int, date.split('-'))) raise TypeErrorclass Person(object): def __init__(self, name, birthday): self.name = name self.birthday = birthday @property def birthday(self): return self._birthday @birthday.setter def birthday(self, birthday): self._birthday = str_to_date(birthday) @property def age(self): return datetime.date.today() - self.birthday def __str__(self): return '%s,%s(%s)'%(self.name,self.birthday, self.age) person = Person('Xiao Ming','1980-10-1')print(person) person.birthday = '1981-1-2'print(person)person.birthday = datetime.date(1979,12,12)print(person)person.birthday = '123456' # raise TypeError
关于同时更新多个值的问题。
Java Bean 中绝大多数情况,都是一个 setter getter 只负责一个属性,只有极少数的 setter 和 getter 才会有关联的操作,对于这部分属性,你大可以在 python 中写一个 setter 来处理。 见 @勇者天空 的回答 http://segmentfault.com/q/10100000001...
要不你就运算好了以后直接赋值
要不你就写一个setAttr(value)方法, 因为是方法, 意味着可能存在其他运算, 提醒其他人这里可能有magic.
同理可以写getAttr()方法.
本来是一个方法, 你也确确实实写了方法, 硬要假装自己是attrbute, 何苦呢?
编橙之家文章,
相关内容
- 有比python comet框架功能更好的开源框架码,pythoncomet,想
- linux下多个python版本切换如何设置,linuxpython,比如自带
- django model实现,如何实现外键对多种模型,djangomodel,就是
- Python闪退问题,py2exe打包执行闪退了怎么调整,pythonpy
- python不同版本list内中文输出问题,python不同版本,foo
- python函数应用请大神帮我看代码问题,python大神,问这个
- Django外键objects.get究竟该怎么写,djangoobjects.get,model定义
- 爬虫状态码返回状态200,自己访问400,这是什么原因?,爬
- Python requests爬虫编码encoding error是什么问题,requestsen
- 适合Python应用的Vim缩进调试方法,pythonvim缩进调试,我的
评论关闭