news 2026/6/26 3:30:47

Python内置函数进阶:delattr到divmod

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python内置函数进阶:delattr到divmod

一、delattr():动态属性管理的"删除专家"

1.1 基础用法:删除对象属性

delattr()函数是setattr()的配套函数,用于动态删除对象属性。

classUser:def__init__(self,name,age,email):self.name=name self.age=age self.email=email# 创建用户实例user=User("张三",25,"zhang@example.com")print(f"删除前属性:{user.__dict__}")# 删除email属性delattr(user,'email')print(f"删除后属性:{user.__dict__}")# 等价于直接使用deldeluser.ageprint(f"最终属性:{user.__dict__}")

1.2 实际应用:动态配置管理

classConfigManager:def__init__(self):self._config={'debug_mode':True,'log_level':'INFO','max_connections':100}# 将配置项设置为实例属性forkey,valueinself._config.items():setattr(self,key,value)defremove_config(self,key):"""安全删除配置项"""ifhasattr(self,key):delattr(self,key)print(f"已删除配置:{key}")else:print(f"配置项不存在:{key}")defcleanup_temp_attrs(self):"""清理临时属性"""temp_attrs=[attrforattrindir(self)ifattr.startswith('_temp_')]forattrintemp_attrs:delattr(self,attr)print(f"清理临时属性:{attr}")# 使用示例config=ConfigManager()print(f"初始配置:{config.debug_mode}")# 动态添加临时属性config._temp_cache="临时数据"config.remove_config('debug_mode')config.cleanup_temp_attrs()

二、dict():字典创建的"多面手"

2.1 三种创建字典的方式

dict()函数提供了三种灵活的方式来创建字典:

# 方式1:关键字参数创建person1=dict(name="李四",age=30,city="北京")print(f"关键字创建:{person1}")# 方式2:从映射对象创建fromcollectionsimportOrderedDict ordered_dict=OrderedDict([('name','王五'),('age',25)])person2=dict(ordered_dict)print(f"映射创建:{person2}")# 方式3:从可迭代对象创建items=[('name','赵六'),('age',28),('city','上海')]person3=dict(items)print(f"可迭代创建:{person3}")# 方式4:组合使用person4=dict([('name','钱七')],age=35,city="广州")print(f"组合创建:{person4}")

2.2 实际应用:配置合并与转换

classConfigBuilder:@staticmethoddefmerge_configs(*configs):"""合并多个配置字典"""result=dict()forconfiginconfigs:ifisinstance(config,dict):result.update(config)elifhasattr(config,'__iter__'):result.update(dict(config))returnresult@staticmethoddefcreate_from_env_vars(env_vars):"""从环境变量列表创建配置"""# 模拟环境变量:KEY=VALUE格式env_pairs=[env.split('=')forenvinenv_varsif'='inenv]returndict(env_pairs)@staticmethoddefnormalize_config(config_data):"""标准化配置数据"""ifisinstance(config_data,dict):returnconfig_dataelifhasattr(config_data,'_asdict'):# 命名元组returndict(config_data._asdict())elifisinstance(config_data,(list,tuple)):returndict(config_data)else:raiseValueError("不支持的配置格式")# 使用示例default_config={'debug':False,'port':8080}user_config=[('debug',True),('host','localhost')]env_config=['DB_HOST=localhost','DB_PORT=5432']# 合并配置final_config=ConfigBuilder.merge_configs(default_config,user_config,ConfigBuilder.create_from_env_vars(env_config))print(f"最终配置:{final_config}")

三、dir():对象探索的"显微镜"

3.1 基础用法:探索对象属性

dir()函数是Python自省的重要工具,可以查看对象的可用属性和方法。

importmath# 查看当前作用域的名称print("当前作用域名称:")current_names=[namefornameindir()ifnotname.startswith('_')]print(current_names[:5])# 显示前5个# 查看模块的属性print("\nmath模块的部分函数:")math_functions=[namefornameindir(math)ifnotname.startswith('_')andcallable(getattr(math,name))]print(math_functions[:8])# 显示前8个函数# 查看自定义对象的属性classSmartDevice:def__init__(self,name,status=False):self.name=name self._status=statusdefturn_on(self):self._status=Truedefturn_off(self):self._status=Falsedef__dir__(self):"""自定义dir()输出"""return['name','status','turn_on','turn_off','is_active']device=SmartDevice("智能灯")print(f"\n设备属性:{dir(device)}")

3.2 实际应用:动态API探索器

classAPIExplorer:def__init__(self,target_object):self.target=target_objectdefexplore_methods(self):"""探索对象的方法"""methods=[namefornameindir(self.target)ifcallable(getattr(self.target,name))andnotname.startswith('_')]returnmethodsdefexplore_properties(self):"""探索对象的属性"""properties=[namefornameindir(self.target)ifnotcallable(getattr(self.target,name))andnotname.startswith('_')]returnpropertiesdefget_method_signature(self,method_name):"""获取方法签名信息"""try:method=getattr(self.target,method_name)return{'name':method_name,'callable':callable(method),'module':getattr(method,'__module__','Unknown'),'doc':getattr(method,'__doc__','No documentation')}exceptAttributeError:returnNonedefgenerate_api_docs(self):"""生成简单的API文档"""print(f"==={self.target.__class__.__name__}API ===")print("\n方法:")formethodinself.explore_methods()[:5]:# 只显示前5个info=self.get_method_signature(method)ifinfo:print(f"{info['name']}-{info['doc'][:50]}...")print("\n属性:")forpropinself.explore_properties()[:5]:# 只显示前5个print(f"{prop}")# 使用示例:探索list类型explorer=APIExplorer([])explorer.generate_api_docs()

四、divmod():数学运算的"双响炮"

4.1 基础用法:同时获取商和余数

divmod()函数返回商和余数组成的元组,特别适合需要同时使用两种结果的场景。

# 整数除法result=divmod(10,3)print(f"10除以3: 商={result[0]}, 余数={result[1]}")# 浮点数除法float_result=divmod(10.5,3.2)print(f"10.5除以3.2: 商={float_result[0]:.2f}, 余数={float_result[1]:.2f}")# 等价于a,b=10,3manual_result=(a//b,a%b)print(f"手动计算:{manual_result}")

4.2 实际应用:时间转换和分页计算

classCalculator:@staticmethoddefseconds_to_hms(total_seconds):"""将秒数转换为小时:分钟:秒格式"""hours,remainder=divmod(total_seconds,3600)minutes,seconds=divmod(remainder,60)returnhours,minutes,seconds@staticmethoddefcalculate_pagination(total_items,items_per_page):"""计算分页信息"""total_pages,remainder=divmod(total_items,items_per_page)ifremainder>0:total_pages+=1returntotal_pages@staticmethoddefmoney_breakdown(total_cents):"""将金额分解为元、角、分"""yuan,remainder=divmod(total_cents,100)jiao,fen=divmod(remainder,10)returnyuan,jiao,fen@staticmethoddefcoordinate_conversion(total_units,base_unit):"""坐标单位转换"""major_units,minor_units=divmod(total_units,base_unit)returnmajor_units,minor_units# 使用示例calc=Calculator()# 时间转换seconds=3665hours,minutes,seconds=calc.seconds_to_hms(seconds)print(f"{seconds}秒 ={hours}小时{minutes}分钟{seconds}秒")# 分页计算total_items=105items_per_page=10pages=calc.calculate_pagination(total_items,items_per_page)print(f"{total_items}个项目,每页{items_per_page}个,需要{pages}页")# 金额分解total_cents=1234yuan,jiao,fen=calc.money_breakdown(total_cents)print(f"{total_cents}分 ={yuan}{jiao}{fen}分")

五、高级技巧与最佳实践

5.1 安全使用delattr()

classSafeAttributeManager:def__init__(self):self._protected_attrs=['id','created_at']self._attributes={}def__setattr__(self,name,value):ifname.startswith('_'):super().__setattr__(name,value)else:self._attributes[name]=valuedef__getattr__(self,name):ifnameinself._attributes:returnself._attributes[name]raiseAttributeError(f"属性不存在:{name}")defsafe_delattr(self,name):"""安全删除属性"""ifnameinself._protected_attrs:raiseValueError(f"受保护的属性不能删除:{name}")ifnameinself._attributes:delself._attributes[name]print(f"已删除属性:{name}")else:print(f"属性不存在:{name}")defcleanup(self):"""清理所有非保护属性"""attrs_to_delete=[attrforattrinself._attributesifattrnotinself._protected_attrs]forattrinattrs_to_delete:self.safe_delattr(attr)# 使用示例manager=SafeAttributeManager()manager.name="测试"manager.value=100print(f"删除前:{manager._attributes}")manager.safe_delattr('name')manager.safe_delattr('id')# 会报错print(f"删除后:{manager._attributes}")

5.2 组合使用这些函数

defanalyze_object(obj):"""综合分析对象的属性"""analysis={}# 获取所有属性all_attrs=dir(obj)analysis['total_attributes']=len(all_attrs)# 分类属性analysis['methods']=[attrforattrinall_attrsifcallable(getattr(obj,attr))]analysis['properties']=[attrforattrinall_attrsifnotcallable(getattr(obj,attr))]# 计算各类属性的比例total=len(all_attrs)method_count=len(analysis['methods'])prop_count=len(analysis['properties'])iftotal>0:method_ratio,remainder=divmod(method_count*100,total)prop_ratio=prop_count*100//total analysis['ratios']=(method_ratio,prop_ratio)returnanalysis# 测试分析函数classTestClass:defmethod1(self):passdefmethod2(self):passattr1="属性1"attr2="属性2"test_obj=TestClass()result=analyze_object(test_obj)print(f"分析结果:{result}")

六、总结与实用建议

通过今天的探索,我们深入了解了四个强大的内置函数:

  1. delattr()- 动态属性管理的利器
  2. dict()- 灵活创建字典的多面手
  3. dir()- 对象自省的显微镜
  4. divmod()- 高效数学运算的双响炮

关键知识点总结:

  • delattr(x, 'attr')等价于del x.attr
  • dict()支持三种不同的初始化方式
  • dir()是探索Python对象的重要工具
  • divmod(a, b)返回(a // b, a % b)

实用建议:

  1. 安全性优先:使用delattr()时确保属性存在
  2. 选择合适的方式:根据数据源选择最合适的dict()创建方式
  3. 善用自省:调试时多用dir()了解对象结构
  4. 效率考虑:需要商和余数时优先使用divmod()

进阶学习方向:

  • 深入学习Python的描述符协议
  • 探索__dir__()方法的自定义实现
  • 研究这些函数在元编程中的应用

内置函数是Python语言设计的精华所在,掌握它们能让你写出更优雅、高效的代码。从今天开始,尝试在项目中灵活运用这些函数,你会发现编程效率的显著提升。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/19 19:51:54

港口综合治理空间智能平台专项建设方案——人–车–船–设备一体化的空间视频智能治理技术路径

港口综合治理空间智能平台专项建设方案 ——人–车–船–设备一体化的空间视频智能治理技术路径 建设单位:镜像视界(浙江)科技有限公司 一、建设背景与治理挑战 港口是典型的高密度、多要素、强耦合运行空间,人员、车辆、船舶和…

作者头像 李华
网站建设 2026/6/18 16:00:14

Flutter for OpenHarmony 实战:ElevatedButton 悬浮按钮详解

Flutter for OpenHarmony 实战:ElevatedButton 悬浮按钮详解摘要:本文深入解析 Flutter 框架在 OpenHarmony 平台中 ElevatedButton 悬浮按钮控件的应用实践。通过剖析其核心属性、样式定制、事件处理及状态管理机制,结合鸿蒙原生控件对比和平…

作者头像 李华
网站建设 2026/6/23 18:06:01

(新卷、100分)-敏感字段加密(JavaPythonJSC++C)

题目描述 给定一个由多个命令字组成的命令字符串: 1、字符串长度小于等于127字节,只包含大小写字母,数字,下划线和偶数个双引号; 2、命令字之间以一个或多个下划线_进行分割; 3、可以通过两个双引号””来…

作者头像 李华
网站建设 2026/6/26 1:00:54

RAG优化:rerank+小模型整理提升精度

RAG检索后的原始文本往往存在片段零散、语义不连贯、冗余噪声、逻辑断裂问题 本质是“检索只解决了‘找得到’,没解决‘用得好’” 而“rerank(精准筛选)+ 小模型知识整理(结构化提炼)”的组合方案,正是当前业界解决这一痛点的主流优化思路——既能过滤无效信息,又能把…

作者头像 李华
网站建设 2026/6/16 10:46:18

从RAG的核心技术原理(语义表示、检索机制、知识融合)出发,解决“为什么检索不精准”“为什么知识融合不高效”等根本问题

从RAG的核心技术原理(语义表示、检索机制、知识融合)出发,解决“为什么检索不精准”“为什么知识融合不高效”等根本问题 目录 从RAG的核心技术原理(语义表示、检索机制、知识融合)出发,解决“为什么检索不精准”“为什么知识融合不高效”等根本问题 简单rag 简介 一、嵌…

作者头像 李华
网站建设 2026/6/15 6:42:51

Kafka在大数据生态中的角色与应用场景

Kafka在大数据生态中的角色与应用场景:从“数据快递站”到“实时流中枢” 1. 引入与连接:你身边的Kafka故事 凌晨12点,你在电商APP上下了一单零食;12点01分,首页弹出“你可能喜欢的同款薯片”;12点02分&…

作者头像 李华