xiaodouya33 发表于 2015-12-1 08:03:46

Python属性、方法和类管理系列之

>>> a.v  22
  >>> a.v=10
  >>> a.__dict__      #我们设置a.v后,发现实例的__dict__中仍然空空如也。因为此时调用的是__set__方法,值10存入到了Desc实例的value属性上了。
  {}
  >>> A.__dict__
  mappingproxy({'__module__': 'b', '__doc__': None, '__dict__': , '__weakref__': , 'v': })
  >>> a.v             #此时得到的还是Desc的__get__方法返回的结果。
  10
  >>> del a.v         #不允许我们删除
  Traceback (most recent call last):
  File "", line 1, in
  AttributeError: __delete__
  >>> A.v=30
  >>> A.__dict__
  mappingproxy({'__module__': 'b', '__doc__': None, '__dict__': , '__weakref__': , 'v': 30})
  #我们把__set__方法的原来语句注销,添加raise AttribeError语句,再次运行
  >>> a.v=30          #我们在__set__中手动添加了AttributeError异常,所以我们再也不能设置a.v的值了,因此该属性鞭策了只读属性。
  Traceback (most recent call last):
  File "", line 1, in
  File "/home/aaa/proj/b.py", line 8, in __set__
  raise AttributeError
  AttributeError
  >>> A.v=20          #通过类,仍然可以改变属性
  >>> A.__dict__      #改变后,变成了普通属性20了,这时甚至都已经不再是描述符类了。
  mappingproxy({'__doc__': None, '__dict__': , '__module__': 'b', '__weakref__': , 'v': 20})
  >>> del A.v
页: [1]
查看完整版本: Python属性、方法和类管理系列之