问题答案
我看到一个文章:
 
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
答案
可以看下python文档里property setter/getter相关部分
 
  1. import datetime, re 
  2.  
  3. DATE_PATTERN = re.compile('^\d+\-\d+\-\d+$'
  4.  
  5. def str_to_date(date): 
  6.     if isinstance(date, datetime.date): 
  7.         return date 
  8.     elif isinstance(date,str) and DATE_PATTERN.match(date): 
  9.         return datetime.date(*map(int, date.split('-'))) 
  10.     raise TypeError 
  11. class Person(object): 
  12.     def __init__(self, name, birthday): 
  13.         self.name = name 
  14.         self.birthday = birthday 
  15.          
  16.     @property 
  17.     def birthday(self): 
  18.         return self._birthday 
  19.      
  20.     @birthday.setter 
  21.     def birthday(self, birthday): 
  22.         self._birthday = str_to_date(birthday) 
  23.      
  24.     @property 
  25.     def age(self): 
  26.         return datetime.date.today() - self.birthday 
  27.      
  28.      
  29.     def __str__(self): 
  30.         return '%s,%s(%s)'%(self.name,self.birthday, self.age) 
  31.      
  32. person = Person('Xiao Ming','1980-10-1'
  33.  
  34. print(person) 
  35.   
  36. person.birthday = '1981-1-2' 
  37.  
  38. print(person) 
  39.  
  40. person.birthday = datetime.date(1979,12,12
  41.  
  42. print(person) 
  43.  
  44. person.birthday = '123456' # raise TypeError 
举一反三