当前位置: 首页 > news >正文

专门做水生植物销售网站做网站兰州

专门做水生植物销售网站,做网站兰州,平面设计难不难,蚌埠建设学校网站教育学校本篇文章主要内容 代理类主要功能是将一个类实例的属性访问和控制代理到代码内部另外一个实例类#xff0c;将想对外公布的属性的访问和控制权交给代理类来操作#xff0c;保留不想对外公布的属性的访问或控制权#xff0c;比如只读访问#xff0c;日志功能 在代理类中实…本篇文章主要内容 代理类主要功能是将一个类实例的属性访问和控制代理到代码内部另外一个实例类将想对外公布的属性的访问和控制权交给代理类来操作保留不想对外公布的属性的访问或控制权比如只读访问日志功能 在代理类中实现被代理的类属性访问和修改权限控制异常捕获代理类的简化示例 代理类的一个简单的实现方式示例 目标实现类Product的实例属性让另一个类Proxy来代理访问和控制想将对外公布的属性交给代理类让外部访问和控制不想对外公布的属性无法通过代理来访问和控制这里不想对外公布的属性约定用下划线命名开头 # proxy_example1.py # 以下是一个代理类实现只读访问的示例 # 目标代理后只能访问和修改Product的公开属性私有属性_current只能查看不能修改 class Product:def __init__(self, price, quantity):self.price priceself.quantity quantityself._current 123# 只暴露代理类Proxy给外部使用 class Proxy:def __init__(self, obj):self._obj objdef __getattr__(self, item): # 本实例没有找到的属性会执行__getattr__方法if item.startswith(_): # 约定下划线开头的方法不能访问到被代理的类只会访问到代理类raise Exception(f{item} not found) # Product存在的私有属性也不希望被外部知道return getattr(self._obj, item)def __setattr__(self, key, value):if key.startswith(_): # 约定下划线开头的方法不能访问到被代理的类只会访问到代理类# 注这里不能raise这会导致Proxy的实例都无法创建__dict__等属性无法创建super(Proxy, self).__setattr__(key, value) # 避免无限循环else:setattr(self._obj, key, value)# 要求只能删除非下划线开头的属性def __delattr__(self, item):if item.startswith(_):super(Proxy, self).__delattr__(item) # 避免无限循环else:delattr(self._obj, item)def test_getattr():p Product(10, 1)pp Proxy(p)print(pp.price)print(pp._curr)def test_setattr():p Product(10, 2)pp Proxy(p)pp.abc 1print(pp.abc, p.abc)pp._curr 10000print(pp._curr) # 私有属性设置给了代理类print(p._curr) # raise an error, 被代理的类Product的属性没有设置成功也无法访问def test_delattr():p Product(10, 2)pp Proxy(p)pp.abc 123print(pp.abc, p.abc)# 删除公开属性del pp.abc # 成功# print(pp.abc, p.abc) # 已被删除# # 删除私有属性# del pp._curr # 会尝试删除Proxy的私有属性raise AttributeError: _curr# 先创建在删除pp._def 123 # 这个操作只会设置Proxy的实例属性print(pp._def) # 访问的是Proxy实例属性被代理的Product实例没有创建_def属性# del pp._def # 删除的是Proxy的实例属性# print(pp._def)测试获取属性 if __name__ __main__:test_getattr()输出 10 ... Exception: _curr not found ...测试设置属性 if __name__ __main__:test_setattr()输出 1 1 10000 ... AttributeError: Product object has no attribute _curr ...测试删除属性 if __name__ __main__:test_delattr()输出 123 123 123注以双下划线开头和结尾的方法无法被代理想要使用必须在代理类中定义出这个方法然后重定向到被代理的类的方法比如你想使用isinstance()方法就要在Proxy伪造定义__class__属性想要使用len()方法就要在Proxy定义__len__方法 # proxy_example2.py class Product:def __init__(self, price, quantity):self.price priceself.quantity quantityself._current 123def __len__(self):return 111# 只暴露代理类Proxy给外部使用 class Proxy:def __init__(self, obj):self._obj objdef __getattr__(self, item): # 本实例没有找到的属性会执行__getattr__方法if item.startswith(_): # 约定下划线开头的方法不能访问到被代理的类只会访问到代理类raise Exception(f{item} not found) # Product存在的私有属性也不希望被外部知道return getattr(self._obj, item)def __setattr__(self, key, value):if key.startswith(_): # 约定下划线开头的方法不能访问到被代理的类只会访问到代理类# 注这里不能raise这会导致Proxy的实例都无法创建__dict__等属性无法创建super(Proxy, self).__setattr__(key, value) # 避免无限循环else:setattr(self._obj, key, value)# 要求只能删除非下划线开头的属性def __delattr__(self, item):if item.startswith(_):super(Proxy, self).__delattr__(item) # 避免无限循环else:delattr(self._obj, item)propertydef __class__(self): # 伪造__class__属性return self._obj.__class__def __len__(self):return len(self._obj)def test_instance():p Product(10, 2)pp Proxy(p)print(pp.__class__)print(isinstance(pp, Product)) # 如果不伪造__class__会返回Falsedef test_len():p Product(10, 2)pp Proxy(p)print(len(pp)) # 如果Proxy实例不定义__len__方法会报错TypeError: object of type Proxy has no len()测试伪造的实例class类型 if __name__ __main__:test_instance()输出 class __main__.Product True测试获取长度 if __name__ __main__:test_len()输出 111一个实现日志输出的代理类的简化示例 捕获web server报错日志并执行异常处理的示例 # logger_proxy.py # -*- coding:utf-8 -*- from functools import wrapsclass DAL:classmethoddef dm1(cls, req, *args):print(dm1..., f{req})print(1/0) # 故意抛出异常return dm1class BLL:classmethoddef bm1(cls, req):print(bm1..., f{req})return DAL.dm1(req)class Application:def __init__(self, req):self.req reqself._p private attrdef hd1(self):return BLL.bm1(self.req)class LoggerProxy:def __init__(self, obj):self._obj objdef __getattr__(self, item): # LoggerProxy类实例没获取到的属性会执行这个方法attr getattr(self._obj, item)if callable(attr): # 获取到了方法则处理异常捕获wraps(attr)def wrapped_method(*args, **kwargs):# print(fBefore accessing to attribute/method: {item})try:method attr(*args, **kwargs)except ZeroDivisionError:# 捕获异常然后处理...raise Exception(f{attr.__name__} received a zero division error.)# print(fAfter attribute/method {item} returned)return methodreturn wrapped_methodelse: # 获取到了属性直接返回return attrif __name__ __main__:lp LoggerProxy(Application(abc))print(lp.req)print(lp._p)print(lp.hd1())运行输出 abc private attr bm1... reqabc dm1... reqabc Traceback... ZeroDivisionError: division by zero During handling of the above exception, another exception occurred: Traceback... Exception: hd1 received a zero division error.总结 本节主要的内容是实现了一个代理类达到代理访问和控制某个类的属性并避免将私有属性暴露给外部需要注意一些特殊方法也就是python双下划线开头和结尾的方法如果想要被代理类访问和控制就必须在代理类中也定义对应的实际方法另外示例中主要是以下划线开头的方法作为私有属性的约定也可以使用其他约定这样在代理方法中的访问和修改时做出相应的判断即可
http://www.zqtcl.cn/news/994391/

相关文章:

  • 网站开发包含哪些网站设计实例
  • 网站建设 核算棋牌源码论坛
  • 杭州网站建设案例网页设计程序
  • 网站建设的相关问题湛江网站开发
  • 网站开发作业wordpress用户角色
  • 品牌网站制作建设微信小程序开发需要什么技术
  • 新网站注册国内食品行业网站开发
  • 太原微商网站建设网站里面的视频功能怎么做的
  • 绿色做环保网站的好处网易企业邮箱登录登录入口
  • 卯兔科技网站建设网站验收时项目建设总结报告
  • 触摸网站手机wordpress建立模板下载
  • 做暧在线观看网站网站建设与管理工资
  • 横岗网站建设无锡网站seo外包
  • 房管局 网站做房查学做网站推广要多久时间
  • 电脑网站开发者模式田园综合体建设网站
  • 南宁广告公司网站建设自适应网站建设模板
  • 做北京电梯招标的网站衡阳县专业做淘宝网站
  • 建设网站的语言wordpress主题自定义添加后台设置
  • 制造动漫网站开发目的四川酒店网站建设
  • 中国城市建设研究院深圳分院网站广西圣泰建设工程有限公司网站
  • 网站建设的方法有哪些内容wordpress展示插件
  • 北京手机网站制作公司wordpress 简易教程
  • 手机网站建站公司有哪些搜索引擎收录
  • 仿同程网 连锁酒店 网站模板学校网站建设用哪个系统
  • 教做甜品的网站删除wordpress主题字体载入
  • 做酒店网站所用到的算法wordpress侧栏导航
  • 做漫画的网站有哪些信息门户网站怎么做
  • 九江集团网站建设公司信誉好的广州做网站
  • 福州网站建设服务平台今天发生的重大新闻
  • 招聘信息网搜索引擎优化代理