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__方法Python中的魔术方法__call__和__getattr__方法是用于实现对象可调用和属性访问的重要方法。
-
今日快讯:慕思股份4月20日盘中跌幅达5%以下是慕思股份在北京时间4月20日14:31分盘口异动快照:4月20日,慕思股份盘中跌幅达5%,截至14点31分,报36 45元,成交5976 41万元,换手率4
-
尖疣早期症状会痒吗_尖锐湿疣会痒吗1、通常尖锐湿疣不痒,主要表现是皮肤或黏膜表面突起的增生,本身只是导致一种奇怪的感觉,特别是比较大和小的时候。2、如果用
-
翠微股份:控股子公司海科融通在收单业务中存在部分标准类商户交易使用优惠类商户交易费率上送清算网络的情形|每日快看翠微股份(603123):控股子公司海科融通在收单业务中存在部分标准类商户交易使用优惠类商户交易费率上送清算网络的情形,海科融通需按照相关协
-
奥运五环图片_奥运五环黄环代表1、五环的蓝、黄、黑、绿和红色开始成为五大洲的象征。2、分别代表欧洲、亚洲、非洲、澳洲和美洲。本文分享完毕,希望对大家有
-
世界观热点:多国拟定从台湾“撤侨计划”,台民众反问:我们往哪里撤?台海网4月20日综合报道据印尼媒体报道,印尼政府因应台海紧张情势升温,已经拟定“撤侨”计划,可能撤离在台湾的35万名印尼公民。有岛内舆...
-
剑桥科技04月19日大涨,股价创历史新高04月19日,剑桥科技股价大涨。截至今日收盘,剑桥科技上涨9 99%,收盘价为52 51元,收盘价创历史新高。上海剑桥科技股份有限公司的主营业务是
-
新蔡女教师勇救轻生溺水者|最新资讯发现轻生溺水者,冲到水里救人,连日来,熊书丽的事迹在学校、在新蔡县被人赞颂。但转念一想,这个天气怎么会游泳呢?我发现她穿着衣服,是挣
-
环球快消息!中国联通跌5.6% 民生证券在其年内高点推荐中国经济网北京4月19日讯中国联通(600050 SH)今日截至收盘报5 73元,跌幅5 60%。 2023年3月14日,中国联通盘中创下年内来最高股价6 45元。
-
地热供暖 河南要建4个千万平方米示范区|实时不断追求“双碳”目标的未来,会是怎样的一番景象?让新能源、可再生能源更有效地转化为现实生产力,河南仍将在哪些方面努力?昨
-
世界时讯:榴莲有点生放冷冻会熟吗?会的。拆开的榴莲不熟怎么放才熟:1、榴莲开了没熟可以用保鲜膜包起来放冰箱里。放冰箱,第一味道会好吃很多,奶味会重很多。第二也不会坏,放
-
华为有大动作?孟晚舟称数字化是全行业的共同机遇4月19日,CNMO注意到,2023华为全球分析师大会在深圳举行。本届大会将以“跃升数字生产力,加速迈向智能世界”为主题。在大会上,华为副董...
-
今日热门!露西1、露西(英语:Lucy)是一具发现于东非的古人类化石标本。2、此标本具有约40%的阿法南方古猿骨架,由唐纳德·约翰森等
-
环球热讯:联通手机彩铃怎么设置_联通手机怎样开启彩铃服务解答:1、目前联通没有彩铃业务,只有彩铃业务。办理中国联通彩铃业务的方式如下:2、1元:发送“kt”至10655158,
-
环球新消息丨国科微:4月19日融资买入1.07亿元,融资融券余额8.46亿元4月19日,国科微(300672)融资买入1 07亿元,融资偿还1 09亿元,融资净卖出234 59万元,融资余额5 61亿元,近20个交易日中有12个交易日出现融资净买入。
-
米猪肉煮熟后能吃吗(米猪肉的图片)1、需要详细观察,用刀切开猪瘦肉部分,可以见到或多或少的白点或类似小米粒、高粱米粒状白颗粒,这就是虫卵,这种肉就是米猪肉。2、好猪肉没
-
环球热消息:国家发改委:建立鼓励民间资本参与重大项目建设机制国家发改委:建立鼓励民间资本参与重大项目建设机制---国家发展改革委昨天(4月19日)举行新闻发布会。发布会上,国家发展改革委新闻发言人孟
-
天天实时:全筑股份被债权人申请预重整 仍背负200余起未结案件公告显示,在4月18日,公司收到债权人森西实业的《通知书》,因公司不能清偿到期债务且明显缺乏清偿能力,但具有重整价值,森西实业将于4月19
-
焦点短讯!二十四小时播报:英超第32、33轮裁判安排 赖特不确定阿森纳是否需要哈兰德式前锋这可能会破坏平衡一、英超第333轮裁判安排直播吧4月18日讯英超官方公布第32轮、第33轮裁判安排,安东尼-泰勒将执法第33轮热刺vs
-
4月18日至21日佛山陶博会期间 禅城开通免费旅游公交专线 全球快看点佛山新闻网讯佛山日报记者黄宇琴通讯员朱明报道:4月18日至21日,第38届春季佛山陶博会将在中国陶瓷城、中国陶瓷总部、佛山国际会议展览中心三
-
社保缴费有几个档次?每个地区的档次标准都是不一样的实际上,不管是职工社保还是居民社保,相应的缴费档次都是当地的社保部门所规定的,并没有比较固定的标准,不同地区的参保人进行社保的缴纳的
-
新消息丨网上购险幸相逢 温暖服务似春风 人保寿险成都电销中心电商客户理赔纪实2022年12月,Z先生因自驾发生交通事故造成全身多处骨折。保单落地服务机构人保寿险成都电话销售中心接到报案后迅速响应,联系客户了解情况并协
-
《原神》3.6纳行久体系培养分享 纳行久体系怎么配? 天天快看点原神游戏中有很多体系玩法,其中的纳行久体系就是纳西妲+行秋+久岐忍的组合,下面请看由小编带来的原神3 6纳行久体系培养分享,感兴趣的小伙伴
-
环球视讯!默认头像_默认1、如何设置默认浏览器?2、它是用户浏览网页的必备程序之一。windows系统的IE浏览器是我们最常见的浏览器。目前有很
-
2023一级建造师《通信广电》每日测试题(04月19日) 焦点速递2023一级建造师《通信广电》每日测试题(04月19日)由一级建造师考试栏目提供,查找更多2023一级建造师《通信广电》每日测试题(04月19日)请访问ji
-
全球最资讯丨从“快复苏”到“稳复苏”,一季度中国楼市走稳从“快复苏”到“稳复苏”,一季度中国楼市走稳-一季度,中国房地产市场出现由“快复苏”向“稳复苏”模式的转变,楼市企稳回升步伐有望迈...
-
每日速讯:红旗连锁:接受招商证券等机构调研红旗连锁(SZ002697,收盘价:6 33元)发布公告称,2023年4月19日,红旗连锁接受招商证券等机构调研,公司副董事长、副总经理、董秘曹曾俊、财
-
聚焦IPO | 中兴新材毛利率大幅低于同业,研发费用增加却不见专利成果|全球百事通聚焦IPO|中兴新材毛利率大幅低于同业,研发费用增加却不见专利成果
-
涨停雷达:消费电子个股异动 环旭电子触及涨停今日走势:环旭电子(601231)今日触及涨停板,该股近一年涨停4次。异动原因揭秘:1、4月19日盘中互动回复:公司云端及存储产品涉及的服务器主
-
当前短讯!行吕梁市中支加大督办力度推动重大决策部署落实落细人行吕梁市中支把督查督办作为推动工作落实的重要抓手,按照“依法督办、实事求是、注重实效”的原则,不断加大督办力度,压实压细工作