【世界聚看点】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__方法
- 热议:广东悬了!生死战再添不利,马尚克星正式复出,王博恐造黑七奇迹
- 丙烷行情周报(4.17-4.23)
- 司马睿的睿怎么写(睿怎么写)-焦点要闻
- 2023快手奢侈品行业数据价值报告(附下载)|当前短讯
- 世界今日讯!巨头宣布裁员1.2万人后,CEO年收入曝光:15亿!
- 辗转12年 《亲爱的》原型最后一位寻子父亲调查新线索_天天新资讯
- 【全球聚看点】台州市全海深浮力材料技术中心签约暨揭牌仪式举行
- 偿债保障比率负数怎么解释 偿债保障比率
- 罗马诺:拜仁高层非常失望,计划在夏天进行重大调整|全球信息
- A股黑天鹅飞起,2亿股民指鹿为马,原因是这点_环球实时
- 何谓连中三元_ldquo 连中三元 rdquo 的 ldquo 三元 rdquo 是哪 ldquo 三 rdquo 元-环球速读
- 【天天聚看点】阿古茹人间体谈奥特曼新作:非常遗憾不是新生代盖亚
- 广州队2023赛季中甲报名名单:U21球员16人,20岁凌杰任队长_观速讯
- 《孝庄秘史》被曝抄袭作家朴月小说 网友纷纷惊叹:你觉得可惜吗? 天天速讯
- 世界热文:本田艾力绅和奥德赛_本田艾力绅商务车
- 全国面积最大!首家AITO超级体验中心落地深圳 热门看点
- 天天资讯:徐水一中郑曙光个人简介 徐水一中
- PPT时间线制作_ppt时间线
- 每日视点!天天喝柠檬水会减肥吗 天天喝柠檬水会减肥成功吗
- 1海希通讯:4月20日召开业绩说明会,投资者参与 每日动态
- 2信息:美国在叙非法驻军再次盗运叙利亚石油资源
- 3今日聚焦!云南撒玛坝梯田“开秧门”:开出中老友谊之花
- 4世界观速讯丨一边耳朵听不见的原因_耳朵听不见的原因
- 5天天亮点!「韩国股票查询」摇滚教父崔健“根本没变”,演唱会行业却正在改变
- 6南京市人力资源产业十大新闻事件评选结果出炉
- 7焦点要闻:合肥市青年路小学斛兵塘校区_合肥市青年路小学
- 8世界读书日|长沙图书馆“你的Book我买单”启动 当前动态
- 9小程序免费制作平台哪个好_天天速读
- 10全球报道:工商银行在香港推出“湾区账户通”服务
- 1买乌郎:感觉自己差距还是挺大的,任何时候都不能碰强队就怂|快看
- 2五大联赛效力当前球队最久球员榜:布斯克茨居首,穆勒次席
- 3又被嘲了!因马伊琍“不贴脸”,网友:强行扮嫩,硬演美人 重点聚焦
- 4石家庄:畅通道路为民生幸福“开路”-世界快播
- 5全球观点:nba2020修改器_nba2006修改器
- 6德阳罗江区总工会组织劳模、工匠外出参观学习|全球独家
- 7俄媒:从“处处排队”感受中国经济温度_环球微头条
- 8世界信息:我市召开全市耕地保护工作暨农村乱占耕地建房专项整治工作会议
- 9被数字化难倒的零售商,困在这六个症结上-焦点简讯
- 10世界速递!占比 30%,消息称网约车公司 Lyft 将裁员 1200 人
广告
- 活动资讯 | 鄞州科普地图打卡活动开始啦!-环球精选
- 观热点:魔弹王玩具开箱评测 魔弹王玩具
- 信阳市浉河区民权办事处张李湾社区开展“2023绿书签”宣传活动 全球热推荐
- 遭网友辱骂,拉莫斯@马斯克:消除认证之外也可以试着消除仇恨_天天快报
- 焦点资讯:图知道|保护地球,青年接力
- 雨水即将上线 上海今天多云夜里到明天有小雨
- 归化球员集体爆发!艾克森首球,费南多助攻,国足最强阵呼之欲出 世界热点评
- 世界热头条丨环烷酸钴_关于环烷酸钴介绍
- Python面向对象编程-自定义异常使用(一)
- 孔府秘事
- 天天快看点丨侨银股份联合玉龙国资联合成立公司 注册资本3000万元
- 天天视点!快讯丨湖南涉农贷款余额突破2万亿元
- 航天宏图公布2022年年度权益分配预案 拟10转4股派1.3元|天天快播报
- 台州市烟草_台州烟草网上订货登录
- 成都西岭雪山门票索道费多少?_焦点资讯
- 美元指数小幅收跌 国际金价震荡收涨丨工行连线-天天精选
- 南阳市育儿假休假时间
- 帝科股份:预计2023年一季度净利润为8000万元~9000万元,同比增长336.57%~391.14%
- 观天下!台式电脑开关线连接图_台式电脑开关线怎么接
- 红土镍矿周评:镍矿刚需恢复 镍矿价格暂缓下降_环球聚焦