property简单使用

 class P:
"""
property简单使用
"""
def __init__(self,name):
self._name = name @property
def name(self):
return self._name @name.setter
def name(self,val):
self._name = val @name.deleter
def name(self):
del self._name p = P("zhangsan")
print(p.name)
print(p.__dict__)
p.name = "wangsi"
print(p.name)
print(p.__dict__)

结果:

 zhangsan
{'_name': 'zhangsan'}
wangsi
{'_name': 'wangsi'}

property简单实现

 class Property:

     def __init__(self,fget=None,fset=None,fdel=None):
self.fget = fget
self.fset = fset
self.fdel = fdel
pass def __set__(self, instance, value):
self.fset(instance,value)
return self def __get__(self, instance, owner):
if not instance:
return self
return self.fget(instance) def __delete__(self, instance):
self.fdel(instance)
return self def setter(self,fn):
#保留设置函数的副本
self.fset = fn
return self def deleter(self,fn):
# 保留删除函数的副本
self.fdel = fn
return self class Person: # d = Property()
def __init__(self,data):
self._data = data @Property #等价式 data=Propery(data)
def data(self):
return self._data @data.setter #等价式 data=data.setter(data)
def data(self,val):
self._data = val @data.deleter #等价式 data=data.deleter(data)
def data(self):
del self._data p = Person(19)
p.data = 123
print(Person.__dict__)
print(p.__dict__)
del p.data
print(Person.__dict__)
print(p.__dict__)

结果:

 {'__init__': <function Person.__init__ at 0x0000015F3F0F0598>, '__dict__': <attribute '__dict__' of 'Person' objects>, 'data': <__main__.Property object at 0x0000015F3F0FE240>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__module__': '__main__', '__doc__': None}
{'_data': 123}
{'__init__': <function Person.__init__ at 0x0000015F3F0F0598>, '__dict__': <attribute '__dict__' of 'Person' objects>, 'data': <__main__.Property object at 0x0000015F3F0FE240>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__module__': '__main__', '__doc__': None}
{}

注意:property 依赖装饰器和数据描述器实现

  数据描述器:需要实现__set__()方法和__get__()方法

  非数据描述器:需实现__get__()方法

最新文章

  1. 读书笔记--SQL必知必会--Tips
  2. mock.js
  3. thinkphp语言包
  4. 基于apache的tomcat负载均衡和集群配置
  5. CodeForces Round 195 Div2
  6. 单点登录filter根据redis中的key判断是否退出
  7. 转载RabbitMQ入门(4)--路由
  8. __FILE__,__LINE__,FUNCTION__
  9. mongodb查询只显示指定字段
  10. UIView添加事件
  11. MySql级联操作
  12. 强密码和弱密码并没有什么区别?NIST密码安全标准更新:不再建议密码要求混合大写字母、字符和数字
  13. Nand Flash驱动(实现初始化以及读操作)
  14. 【49】java内部类剖析
  15. BZOJ_3613_[Heoi2014]南园满地堆轻絮_二分答案
  16. Python函数zip-map
  17. python 守护进程、同步锁、信号量、事件、进程通信Queue
  18. AngularJs的MVC模式
  19. [Windows Azure] Management REST API Reference
  20. c++引用与指针的关系

热门文章

  1. 关于 from scipy.misc import imread, imresize, imsave 报错的问题
  2. Ubuntu 18.04安装Conda、Jupyter Notebook、Anaconda
  3. 执行DOS命令并返回结果
  4. 剑指Offer-16.合并两个排序的链表(C++/Java)
  5. [PHP] 阿里云 Composer 全量镜像
  6. 实验1c语言的开发环境使用和数据类型,运算符,表达式
  7. 代码问题【LDES//AAAI2019】
  8. [NewLife.XCode]实体工厂(拦截处理实体操作)
  9. PHP-内嵌foreach的巧妙优化
  10. Vue.js 源码分析(四) 基础篇 响应式原理 data属性