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

美美淘-专做女鞋拿货选款网站广告设计公司清晨必发图片

美美淘-专做女鞋拿货选款网站,广告设计公司清晨必发图片,云南建设网,中山快速做网站公司反射与二次加工标准类型一、反射 反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。 有四个可以实现自省(反射)的函数#xff0c;如下表所示#xff1a; 函数名含义hasattr(object,name)判断object中有没有一个name字符串对应的方法或属性getattr(object,na… 反射与二次加工标准类型一、反射 反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。 有四个可以实现自省(反射)的函数如下表所示 函数名含义hasattr(object,name)判断object中有没有一个name字符串对应的方法或属性getattr(object,name, defaultNone)检查obj.__dict__中有没有name这个键值有则不做任何处理没有则报错setattr(object,name,value)等价于object.namevaluedelattr(object,name)等价于del object.name各个函数具体代码实现 class BlackMedium:feture Uglydef __init__(self,name,addr):self.name nameself.addr addrdef sell_hourse(self):print(%s正在卖房子 %self.name)def rent_hourse(self):print(%s正在租房子 %self.name)print(hasattr(BlackMedium,feture)) #结果为True b1 BlackMedium(alex,厦门) print(hasattr(b1,name)) #结果为True print(hasattr(b1,sell_hourse)) #结果为Trueprint(getattr(b1,name)) #结果为alex g getattr(b1,sell_hourse) g() #结果为alex正在卖房子 print(getattr(b1,sell_hoursesafgsgr,没有这个属性)) #结果为没有这个属性setattr(b1,phone,18264894546) print(b1.__dict__) #结果为{name: alex, addr: 厦门, phone: 18264894546} setattr(b1,func,lambda x:x1) print(b1.__dict__) #结果为{name: alex, addr: 厦门, phone: 18264894546, func: function lambda at 0x000000000041C1E0} delattr(b1,func) print(b1.__dict__) #结果为{name: alex, addr: 厦门, phone: 18264894546} 上述代码介绍了实现自省(反射)的函数。 反射的两个好处 第一的好处实现可插拔机制 假设程序员a与程序员b负责同一个项目程序员a负责实现功能而程序员b负责执行功能那么程序员b在执行功能时发现程序员a的实现功能还未写入这样就会出错该如何解决这一问题我们可以使用上面所学的反射来解决具体代码如下 #程序员a写的实现功能写在ftp_client.py文件 class FtpClient:def __init__(self,addr):print(正在连接服务器%s %addr)self.addr addr# def put(self): #假设这方法还没写被程序员b调用# print(正在上传文件) #程序员b写的执行功能写在ftp_bin.py文件 from ftp_client import FtpClientf1 FtpClient(1.1.1.1) #f1.put() ftp_client文件还没有写这功能会报错可以利用反射方式判断如下所示if hasattr(f1,put):func_get getattr(f1,put)func_get() else:print(不存在此方法处理其它的逻辑) 上述代码利用反射方式判断相当于事先定义接口接口只有在被完成后才会真正执行这实现了即插即用。 第二个好处动态导入模块(基于反射当前模块成员) 假如你需要导入m1.py模块即 import m1 __import__(m1.tttt) #这是解释器自己内部用的它导入的就是m1模块 importlib.import_module(m1.tttt) #与上面这句效果一样 我们来了解类内置attr函数分别是__setattr__、__getattr__、__delattr__。 __getattr__只有在使用点调用属性且属性不存在时候才会执行,具体如何实现请看下面代码 class Foo:x 1def __init__(self,y):self.y ydef __getattr__(self, item):print(执行__getattr__) #调用一个对象不存在时候才会执行 f1 Foo(10) print(f1.y) #结果为10 print(getattr(f1,y)) #结果为10 f1.svdgsg #结果为执行__getattr__ __delattr__删除属性的时候才会执行该属性不存在也会执行具体实现如下代码所示 class Foo:x 1def __init__(self,y):self.y ydef __delattr__(self, item):print(删除操作__delattr__)self.__dict__.pop(item) #内置的 f1 Foo(10) del f1.y #结果为删除操作__delattr__ del f1.x #结果为删除操作__delattr__报错 __setattr__在类被实例化、以及添加或修改属性的才会执行代码如下 class Foo:x 1def __init__(self,y):self.y ydef __setattr__(self,key,value):print(执行__setattr__)self.__dict__[key] value #内置的 f1 Foo(10) #结果为执行__setattr__ print(f1.__dict__) #结果为{y: 10} f1.z 2 #结果为执行__setattr__ print(f1.__dict__) #结果为{y: 10, z: 2} 二、二次加工标准类型 1.包装 Python为大家提供了标准数据类型以及丰富的内置方法其实在很多场景下我们都需要基于标准数据类型来定制我们自己的数据类型新增/改写方法这就用到了我们刚学的继承/派生知识。 假设利用list方法只能添加到字符串类型具体代码如下 class List(list):def append(self, item):if type(item) is str:super().append(item) else:print(只能添加字符串类型)l1 List(hello) l1.append(alex) print(l1) #结果为[h, e, l, l, o, alex] l1.append(1646) #结果为只能添加字符串类型 print(l1) #结果为[h, e, l, l, o, alex] 上述代码在讲述包装一个类型通常是对已存在的类型的一些定制这种做法可以新建、修改或删除原有产品的功能其它的则保持原样。 2.授权 授权是包装的一个特性授权的过程即是所有更新的功能都是由新类的某部分来处理但已存在的功能就授权给对象的默认属性。 假设我们想要修改文件的写操作具体代码如下 import datetime class Open:def __init__(self,filename,moder,encodingutf-8):#self.filename filenameself.file open(filename,mode,encodingencoding)self.mode modeself.encoding encodingdef write(self,line): #将写操作加上当前时间t datetime.datetime.now()self.file.write(%s %s %(t,line))def __getattr__(self,item):return getattr(self.file,item)f1 Open(a.txt,w) f1.write(1111111\n) #执行类的write方法 f1.write(ssssss\n) f1.write(hhhhh\n) f1.seek(0) print(f1.read()) #先在初始函数找然后在类找最后找到__getattr__方法触发__getattr__ 实现授权的关键点就是类中的__getattr__函数。 转载于:https://www.cnblogs.com/lzc69/p/11264038.html
http://icebutterfly214.com/news/49527/

相关文章:

  • Linux c 面试
  • linux c 目录 存在
  • 保证可靠数据传输的相关原理
  • 2025出国留学机构哪家强?5大靠谱品牌深度测评
  • Wavelet tree
  • nerdbox 进程树
  • linuxserver/librespeed镜像在host网络模式下自定义web监听端口
  • linux c mysql库
  • foobar2000 v2.25.3 汉化版
  • 以太网交换机的吞吐量
  • 常见的steam游戏的营销错误
  • linux c 编译命令
  • linux c 线程编程
  • 【转载】银河麒麟(Kylin)操作系统上移植Qt 5.6.3与QtCreator 4.2.0的完整指南
  • linux c 开发 工具
  • Token快过期的三种续期方案 - 详解
  • 题解:P14435 [JOISC 2013] 收拾吉祥物 / Mascots
  • UE4/UE5反射系统动态注册机制解析 - 实践
  • 2025 年 钢丝网/钢骨架 塑料复合管厂家权威推荐榜/哪家好/有实力/可靠的/排名企业-江苏狼博管道制造有限公司
  • 查看laya已经加载的资源
  • AI热潮下的冷思考:从估值泡沫到就业现实
  • update 锁表了: 执行一个update 表被锁了,原因是什么?
  • 在 Ubuntu 20.04 上安装 gcc/g++ 11,并使用 update-alternatives 管理多个版本。
  • 白嫖MegaLLM–175刀免费额度建教程
  • 2025年11月新疆电力电缆,高压电缆,特种电缆厂家权威推荐,低损耗稳定性强的行业优选线缆!
  • 银河麒麟v10批量部署Python Flask任务小白教程
  • 2025年11月东莞厂房装修服务商推荐:机械加工/仓储物流/恒温恒湿/无尘净化/重型设备厂房装修施工与设计优势!
  • 2025年11月新疆电线电缆厂家最新推荐,精准检测与稳定性能深度解析!
  • C# 中容易出错的问题
  • VideoLLaMA 3新一代前沿多模态基础模型赋能图像与视频深度理解| LLM | 计算机视觉