python中property简单使用与实现
2024-08-28 14:45:59
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__()方法
最新文章
- 读书笔记--SQL必知必会--Tips
- mock.js
- thinkphp语言包
- 基于apache的tomcat负载均衡和集群配置
- CodeForces Round 195 Div2
- 单点登录filter根据redis中的key判断是否退出
- 转载RabbitMQ入门(4)--路由
- __FILE__,__LINE__,FUNCTION__
- mongodb查询只显示指定字段
- UIView添加事件
- MySql级联操作
- 强密码和弱密码并没有什么区别?NIST密码安全标准更新:不再建议密码要求混合大写字母、字符和数字
- Nand Flash驱动(实现初始化以及读操作)
- 【49】java内部类剖析
- BZOJ_3613_[Heoi2014]南园满地堆轻絮_二分答案
- Python函数zip-map
- python 守护进程、同步锁、信号量、事件、进程通信Queue
- AngularJs的MVC模式
- [Windows Azure] Management REST API Reference
- c++引用与指针的关系
热门文章
- 关于 from scipy.misc import imread, imresize, imsave 报错的问题
- Ubuntu 18.04安装Conda、Jupyter Notebook、Anaconda
- 执行DOS命令并返回结果
- 剑指Offer-16.合并两个排序的链表(C++/Java)
- [PHP] 阿里云 Composer 全量镜像
- 实验1c语言的开发环境使用和数据类型,运算符,表达式
- 代码问题【LDES//AAAI2019】
- [NewLife.XCode]实体工厂(拦截处理实体操作)
- PHP-内嵌foreach的巧妙优化
- Vue.js 源码分析(四) 基础篇 响应式原理 data属性