Python面向对象编程-魔术方法-__call__和__getattr__方法 当前快讯
Python中的魔术方法__call__和__getattr__方法是用于实现对象可调用和属性访问的重要方法。
(资料图)
__call__方法
__call__方法是用于定义对象可调用行为的魔术方法。当我们使用()运算符调用一个对象时,Python会自动调用该对象的__call__方法,并将()中的参数传递给__call__方法。因此,我们可以在__call__方法中实现自定义的对象调用行为。
下面是一个简单的例子,展示了如何定义一个可调用的对象:
class Adder: def __init__(self, n): self.n = n def __call__(self, x): return self.n + xadd5 = Adder(5)print(add5(3)) # 输出: 8
在上面的例子中,我们定义了一个Adder类,其中__init__方法用于初始化对象属性n,call__方法用于实现对象的可调用行为。在Adder类的实例化过程中,我们将数字5传递给了构造方法__init,从而初始化了Adder对象的属性n。然后,我们创建了一个名为add5的Adder对象,并使用()运算符将数字3传递给了add5对象。这时,Python会自动调用add5对象的__call__方法,将数字3作为参数传递给__call__方法,并返回n + x的结果,即8。
需要注意的是,__call__方法只有在对象被调用时才会被触发,因此我们可以在__call__方法中实现复杂的计算逻辑或者状态更新操作。同时,__call__方法也可以带有参数,从而支持多种不同的调用方式。
__getattr__方法
__getattr__方法是用于实现对象属性访问的魔术方法。当我们使用点运算符访问一个对象的属性时,如果该属性不存在,Python会自动调用该对象的__getattr__方法,并将属性名称作为参数传递给__getattr__方法。因此,我们可以在__getattr__方法中实现自定义的属性访问行为。
下面是一个简单的例子,展示了如何定义一个具有动态属性的对象:
class DynamicAttr: def __getattr__(self, name): if name == "x": return 1 elif name == "y": return 2 else: raise AttributeError(f""DynamicAttr" object has no attribute "{name}"")obj = DynamicAttr()print(obj.x) # 输出: 1print(obj.y) # 输出: 2print(obj.z) # 输出: AttributeError: "DynamicAttr" object has no attribute "z"
在上面的例子中,我们定义了一个DynamicAttr类,其中__getattr__方法用于实现动态属性访问。当我们使用点运算符访问DynamicAttr对象的属性时,如果属性名称为"x"或者"y",__getattr__方法会返回对应的属性值。如果属性名称不为"x"或者"y",则会抛出AttributeError异常。因此,我们可以使用__getattr__方法为对象动态添加属性,从而实现灵活的对象属性访问行为。
需要注意的是,__getattr__方法只有在对象的属性不存在时才会被触发,因此我们可以在__getattr__方法中实现对特定属性的自定义处理逻辑。同时,getattr__方法也可以与其他属性访问方法(如__getattribute__和__setattr)结合使用,从而实现更加灵活的对象属性访问和修改行为。
综上所述,__call__和__getattr__方法是Python中重要的魔术方法,用于实现对象的可调用行为和属性访问行为。在使用这两个方法时,我们应该注意方法的作用和使用方式,并根据需要实现自定义的行为。下面是一个综合示例,展示了如何使用__call__和__getattr__方法实现一个具有动态属性和可调用行为的对象:
class DynamicObject: def __init__(self): self._attrs = {} def __call__(self, name, value): self._attrs[name] = value def __getattr__(self, name): if name in self._attrs: return self._attrs[name] else: raise AttributeError(f""DynamicObject" object has no attribute "{name}"")obj = DynamicObject()obj("x", 1)obj("y", 2)print(obj.x) # 输出: 1print(obj.y) # 输出: 2print(obj.z) # 输出: AttributeError: "DynamicObject" object has no attribute "z"
在上面的例子中,我们定义了一个DynamicObject类,其中__call__方法用于为对象动态添加属性,__getattr__方法用于实现对象的动态属性访问。在DynamicObject类的实例化过程中,我们创建了一个名为_attrs的字典,用于存储对象的属性。然后,我们使用()运算符调用DynamicObject对象,传递属性名称和属性值作为参数,从而动态添加属性。最后,我们使用点运算符访问DynamicObject对象的属性,并使用__getattr__方法实现属性访问行为。
需要注意的是,在这个例子中,我们使用了下划线开头的属性名称,以表示这些属性是私有的。这是因为在Python中,如果属性名称以一个或多个下划线开头,则表示该属性是私有的,应该避免直接访问该属性。如果需要访问私有属性,可以使用访问器方法(如getter和setter方法)来实现。
标签:
- Python面向对象编程-魔术方法-__call__和__getattr__方法 当前快讯
- 哈伊杜克U19闯进欧青联决赛后,收到包括来自利瓦..._天天时快讯
- 可再生资源有哪些为什么_可再生资源有哪些英语怎么说
- 焦点快看:英雄无壮举_关于英雄无壮举的简介
- 全球短讯!空间站出舱有何重大意义?荣也(空间站出舱有何重大意义)
- 孔磊
- 变压器阻抗电压 全球观焦点
- 湖北省新增57个省级生态乡镇
- 菏泽市供水集团召开2023年第一季经济运行分析会_今日精选
- 美容美发3_奇妙的美发沙龙-百事通
- 奔腾T90,A级智能SUV_环球观察
- 合并分区有什么坏处_如何合并分区但不丢失文件-环球看点
- 浙江大学在贵州湄潭设立教育发展基金-世界球精选
- 全球热文:两大新能源巨头大动作 钠电池年内将“上车”!这些概念股业绩报喜 市盈率最低不到5倍
- 药流后出血多久正常_药流后有残留但不出血正常吗
- 康诺特起义_视讯
- 如何融化红热糖果|看热讯
- 天天滚动:青海:坚持生态优先、绿色发展 把资源优势转化为产业发展优势
- 2023年度家电惠民收旧焕新潮活动启幕
- 西昌的蓝花楹,盛开!_世界播资讯
- 蘑菇伙伴app_蘑菇伙伴管理系统登录
- 为什么陨石看着很小却很重?小学生在地质博物馆找到答案 环球播报
- 焦点热门:qq身份证实名认证_qq实名认证中心修改身份证
- 天天快消息!膀胱充盈欠佳是什么意思啊 膀胱充盈欠佳是什么意思
- 天天日报丨打开一本书需要几步?看古人的读书风格秀
- 【当前热闻】想回到过去试着让故事继续前行_想回到过去试着让故事继续
- 农管执法装备采购清单惊现“信号屏蔽器”,这东西也能帮到农民?
- 韩国到底想干什么?中俄现在都很生气
- 快资讯:二垒一垒是什么意思-二垒都没挂上什么意思
- 陕西省铜川市2023-04-22 07:45发布道路结冰黄色预警|世界独家
- 【天天新视野】世界读书日丨作家朱鸿荐读:《歌德谈话录》
- 止汗露的危害_止汗露哪个牌子好
- 2023年下半年“165Hz及以上”将成为游戏显示面板主流刷新率
- 全球观焦点:稳步提升粮食产能 全面推进乡村振兴——一季度农业农村经济运行情况观察
- 龙星化工董秘回复:主要是由于第四季度受市场供求影响,产品毛利率有所降低导致
- 美职联费城联合vs多伦多FC比分预测 两队上次交手费城联合主场大胜
- 寿险产品预订利率将再度下调,3.5%成历史?-播资讯
- 经营有道!李春江在珠三角拥很多房产,当包租公,实现财务自由|环球热资讯
- 【环球新要闻】歲緣
- 每日快讯!林口县气象台解除大风黄色预警【III级/较重】
- 在读|殷建灵:穿越人生的浪涛,扬《帆》远航
- 3B家居拟最快本周末申请破产 考虑出售资产和知识产权|天天时快讯
- 全球今头条!Socket编程基础-Socket编程基础
- 芒果超媒:2022年净利润18.25亿元 同比下降13.68%|全球热点评
- 音视频通讯QoS技术及其演进 当前热门
- 今日报丨重要医学成就与进展发布,下一个中国诺奖或出现?
- 今头条!Orange Facts E202303| 尾货价格普遍拉升,后续全球甜橙市场价格仍将稳弱
- 天天滚动:良品铺子:4月21日融资买入193.24万元,融资融券余额1.84亿元
- 要闻速递:沪指跌逾1%,下跌个股近4000只
- 沙海潘子是谁演的(沙海潘子是谁)
- 世界通讯!烤红薯为什么有人觉得比煮的红薯好吃?
- 环球观察:一个“慢性死亡”的社会是什么样的
- 美国4月Markit制造业PMI初值 50.4,预期49.0,前值49.2 世界最新
- 河北气温“大跳水” 张家口阳原气温一日降超20℃
- 今日关注:怎么看大盘成交量?
- 凉丝丝什么意思_凉丝丝先生和他家小攻
- 世界讯息:科创板首两单退市项目乍现:紫晶存储、泽达易盛即将终止上市
- 西平县人民检察院:为企业解难题办实事_当前头条
- 【环球快播报】皇马对塞尔塔大名单:本泽马、莫德里奇领衔,阿拉巴、门迪缺席
- 热点!海口秀英区招商推介会北京站成功举办[图]
- 全球热门:盗墓笔记重启第二季哑女是谁_盗墓笔记重启第二季简介
- 必和必拓维持铁矿石生产指引,下调铜和镍产量预期_天天精选
- 斯泰法诺·皮奥利_关于斯泰法诺·皮奥利简介
- 4月21日基金净值:华富成长趋势混合最新净值1.8383,跌3.09%
- 当前快讯:北京:对牛街采取临时交通管理措施
- 每日动态!小鹏汽车董事长、CEO何小鹏:10年后主流车企只剩8家
- 环球观速讯丨业内热议汽车行业新时代:拥抱“新四化”趋势 打造开放共赢生态圈
- 包子放一天还能吃吗 隔夜包子能吃吗
- 郑州公积金有卡吗?公积金服务网点有哪些?|世界热点
- 世界热议:长春高新:接受通过“全景路演”网站参与公司 2022 年度及 2023 年第一季度业绩说明会的投资者调研
- 节气里的中国智慧丨今日,谷雨
- win10怎么设置默认输入法(怎么设置默认输入法) 全球播报
- 电热毯保温状态费电吗 世界微速讯
- 号称“史上最强火箭”,SpaceX “星舰”发射失败!
- 燃气灶不打火没有哒哒声怎么回事_燃气灶打不着火没有哒哒响-世界微动态
- 我国“存钱利率”最高的3大银行,你知道吗?看完以后再存钱
- 上海迪士尼_上海游乐园
- 焦点讯息:2022年报掘金丨受益算力需求提升 机构年报点评扎堆看好 这两家算力产业链公司股价大涨
- 焦点日报:智能手机维修从入门到精通_对于智能手机维修从入门到精通简单介绍
- 世界微动态丨篮板专家对决!鲁尼与小萨上半场共抢下26个篮板球
- 欧洲创造平面
- 东华软件:中标5.14亿元人工智能计算中心项目
- 环球即时看!4月21日创投板块跌幅达3%
- 航发南方宇航完成新一轮融资 每日消息
- 澳柯玛2022年度拟10派0.7元
- “丰台忙”四十余家开发企业预审青塔地块 年底挂二环百亿宅地!
- 全球消息!货拉拉客服电话人工服务电话_分期乐客服人工服务
- 全球播报:融创中国早盘高开涨幅超14%,境外债务重组方案已获超75%债权人支持
- 什么是Ammoglio酱?
- 微资讯!重估的出口
- 苹果供应链转移中国效应凸显 传富士康深圳工厂削减时薪 天天亮点
- 淄博一季度新建商品住宅网签面积大涨7成 达到120.6万平方米
- 今日播报!这家5年“无人”卖书的书店,“香”在哪?
- 施工规范合同范本(热门30篇)
- 天天滚动:苹果最强对手来了!小米13 Ultra首销:5999元买安卓影像之王
- 大连湾海底隧道已经全线“点亮”!|全球即时
- 焦点速讯:常青科技董秘回复:公司的产品下游终端应用广泛,详情可参见公司招股书
- 全球新资讯:工信部:研究制定工业互联网高质量发展指导意见
- 尹锡悦称“台湾问题是全球问题”,外交部回应
- 全球头条:甘肃举办女大学生就业专场招聘活动
广告
广告
- 如何验证翡翠的真假?只需要简单8步 天天短讯
- DJI RS 3 Mini发布:2千克负载仅795克,支持快速竖拍 天天新消息
- 形容法律威严的句子(精选187句)
- 《宝可梦》满血情况下受到的伤害减半,能带来多少对战机会?
- 世界热推荐:活力中国丨在忙碌的生产线感知中国经济活力
- 全球消息!海南航空回应男子在航班上喊飞机要出事:该名旅客已移交机场公安
- 陆金贷(小额应急)网贷逾期3年多久上征信|全球百事通
- 比亚迪继续减持比亚迪股份,半年已减持超30%
- 胎压监测板块1月9日涨0.91%,通达电气领涨,主力资金净流出2377.78万元_环球快消息
- 世界速看:陆金贷(小额应急)贷款逾期八天延迟还款会影响征信吗
- 記者觀察|封關壬寅末終落幕 港深雙城記開新篇 世界微动态
- 南开区16岁小孩抚养费一般多少钱
- 世界微头条丨十来万的车,我选卡罗拉
- 新华视点|商圈火、景区旺 各地消费市场显活力|聚焦
- 每日热门:光猫和路由器怎么连接 光猫和路由器的正确连接方法
- 蔬菜生吃还是熟吃?你是哪一派?|天天观点
- 天天消息!九典制药(300705.SZ):非洛地平片获批上市
- 热水泡脚脚痒是怎么回事?-环球时快讯
- 面试时,最可怕的就是背调?-世界视点
- 环球短讯![快讯]广联航空:关于特定股东减持数量过半的进展