世界热讯: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__方法
- 全球报道:3分,3篮板,3失误,3犯规!这表现,怎么好意思问湖人要顶薪?
- 天天热文:长沙科大佳园社区:党建聚合力,联心保安全
- 宁夏进一步规范采矿用地管理
- 广西如何填报清华北大高考录取分数线高考进名额-环球观焦点
- 冷门预警:罗马前场核心待定,费耶诺德状态正处巅峰|全球新资讯
- 欲恢复访华未果,G7会议上布林肯要求中国同意与美对话,中方回应 速读
- 全球动态:杭州公开地铁色狼实名惹争议,律师:不违法可起警示作用
- 全球新资讯:图片制作视频app排行榜前十名 图片制作视频免费软件
- 判罚比小萨重!克劳德倒地抓巴特勒脚 被吹一级恶意犯规-当前看点
- 京威股份:股东大会、董事会完成换届后,公司控股股东和实际控制人变更-当前关注
- 2023上海车展:i7 M70L体验 1100牛米还带M的宝马电动车
- 焦点速读:81岁蔡澜不慎摔碎股颈骨入院开刀,称伤势麻烦心情不佳,令人担忧
- 全球快报:iPhone 14遭遇频繁重启bug?
- 几案的读音_几案的意思-全球热点
- 【世界快播报】中字头携手科技股跳水 三大指数收跌
- 世界观热点:可孚医疗:4月19日融资买入251.03万元,融资融券余额2.25亿元
- 世界要闻:上汽发布“三年行动计划”:到2025年,新能源车年销量达350万辆
- 农业农村部市场与信息化司负责人刘涵表示,接下来,我部将继续会同有关部门和单位,密切关注农资市场走势,积极推动企业提高产能利用率,畅通化肥运输渠道,指导农民科学选肥用肥,切实服务好春耕生产,夯实全年粮食丰收基础_百事通
- 信息:海国图志是谁写出来的_海国图志是谁写的
- 业绩快报:天铁股份2022年净利润4.16亿 同比增长37.44%
- 数字政通:2022年年度业绩说明会定于2023年4月26日举行
- 精选!【开年之季】一季度我国造船三大指标市场份额保持全球领先
- 广州:鼓励企事业单位自建保障性租赁房
- 沙尘暴又要来 陕西发布沙尘暴黄色预警信号|天天信息
- 莱特光电: 陕西莱特光电材料股份有限公司2022年年度股东大会会议资料
- Python面向对象编程-魔术方法-__len__和__getitem__方法
- 建业地产:交换要约及同意征求已届满 将发行约7.58亿美元票据_环球热议
- 车子违章停车罚款多少钱?车子违章可以异地处理吗?
- 天天即时看!徐小明:今天没事
- 极目时评|宗利群走了,他演活了彭元帅,也留下了思考_焦点速看
- 长峰医院连年亏损却豪掷上亿打广告 起底长峰坐拥20家连锁医院负债超4亿多家子公司曾因消防问题被罚(今日/头条)
- 世界微头条丨浙数文化(600633):主业表现亮眼,数字经济/AIGC布局提升成长潜力
- 奥比中光:公司的3D视觉AI开放平台提供了强大的AI数据分析与智能场景应用体验
- 北京长峰医院火灾事故已致29人遇难_前沿资讯
- 视讯!康得复合材料有限责任公司
- 全球速看:变动率(300184股票)
- 2023北京五一限行外地车吗?附规定通知
- 揭秘:清朝驸马和公主结婚前,要先和宫女做这种事,让人很尴尬!|天天日报
- 纽约一4层停车场坍塌,数十辆车滑入地下,已致1死5伤
- 一百天八百场 第十二届浦东文化艺术节在沪开幕 世界观察
- 怎样删除发布的抖音作品 抖音怎么删除自己视频?
- 环球资讯:天利科技4月19日快速上涨
- 环球热头条丨光大银行APP打造线上普惠金融服务新体验
- 当前简讯:发改委:通过建机制、强服务等方面工作,使更多的民间资本投入到重大项目建设中来
- 解码首季经济数据|一路鲜花一路歌 春日经济暖意浓 当前快报
- 国际锐评丨中国经济“首季报”何以超出预期|环球热闻
- 最终消费对经济增长贡献率达66.6%
- OpenAI CEO:巨型AI模型时代即将终结,想进步别再靠扩大规模
- 系统把脉,综合治理—— 张家大湖“活”了
- 【环球新要闻】一季度全国房地产开发投资同比下降5.8%
- 世界简讯:任子行:融资净偿还1029.62万元,融资余额2.96亿元(04-18)
- 今日快讯:空气炸锅二次加热蛋挞需要几分钟(空气炸锅二次加热蛋挞需要几分钟才能熟)
- 全球讯息:沙特外交大臣访问叙利亚
- 环球热资讯!宛如我心_关于宛如我心的介绍
- 拒留队!重创尤文!9000万神锋,加盟13个月,要走,阿涅利成全 焦点快报
- 来自福特的福特Fusion车系简介
- 焦点速递!杭州“跑快一步”税费支持让企业提升生存力发展力竞争力
- 世界观速讯丨我是真的栓Q什么时候出 公测上线时间预告
- 全球微资讯!黄河源头在哪里呢-黄河源头在哪里
- 斯德哥尔摩王宫_关于斯德哥尔摩王宫简介-世界看热讯
- 新奥能源(02688.HK):4月18日南向资金减持9100股 世界头条
- 即时看!生长痛怎么缓解疼痛_生长痛怎么缓解
- 皇马率先公布对阵切尔西首发:本泽马、魔笛先发,巴西双星出战
- 怎么看微信注册多久了没有_怎么看微信注册多久 全球今日报
- 安溪县气象台发布雷电黄色预警【Ⅲ级/较重】【2023-04-19】 精选
- 世界上第一台电脑诞生于_世界上第一台电脑
- iPhone 15 全系外观曝光,经典配色回归-快看
- 每日信息:想要有一个好的身体,你一定要保持好心态
- 淮南市教育局开展2023年中小学团体心理拓展观摩研讨活动
- 电子行业深度报告:半导体布局正当时,关注三大投资主线
- 宝宝是如何学会点头摇头的_让宝宝学会认颜色的3个方法
- wof文档_worede文档官方下载
- 每日消息!伊拉克总统:已准备好主持苏丹敌对双方间的对话
- 销售团队队名和口号_销售团队队名和口号有什么
- WBG发布LPL选手大会特辑:兴高采烈的下野辅三人
- 全球热点!广德市推进“个转企”焕发市场新活力
- 全球新资讯:班级德育工作计划初中六年级_班级德育工作计划初中
- 宇智波佐助图片超帅图片高清 宇智波佐助图片素描_环球最资讯
- 全球热推荐:童言童语支招“微改造” 儿童议事助力“有事好商量”
- 鑫铂股份:拟2.4亿美元设立三家子公司
- 积分抵物业费第一年“不能用” 第二年万科物业告知“过期了”?|今日精选
- 【全球速看料】ST冠福(002102)3月31日股东户数3.91万户,较上期减少4.91%
- 当前报道:“顶流”淄博烧烤拉动当地政信信托走俏,城投债标的引争抢
- 热门中概股普涨,纳斯达克中国金龙指数涨超8%
- “静安·夷陵号”旅游专列重启:300余名上海游客抵达湖北宜昌开启峡江人文之旅
- 北京教育考试院关于做好2023年第二次普通高中学业水平合格性考试有关工作的通知 当前视点
- 每日播报!大化举办“五色糯米饭”厨艺大比拼活动
- 客运汽车高速突发故障车上学生紧急转移|世界热门
- 「画家刘学云」工笔重彩,是主观意识与客观再现的统一
- 【聚看点】家庭餐饮消费需求爆发 金锣“一站式家庭肉制品解决方案”将亮相2023中国国际肉展
- 环球今热点:3月中国出口同比增23.4% 官方:稳外贸政策将持续显效
- 她一出现,吊打了多少中年油腻姐姐 每日消息
- 第一部国别体史书--《国语》 第一部国别体史书
- 快递公司安全生产管理制度_快递公司_环球通讯
- 需求与市场“双向奔赴”一季度消费持续回暖
- 封顶、揭牌!厦门几大重点民生项目取得重要进展_天天亮点
- 全球球精选!申请工伤认定进行哪些材料
- 世界实时:郑宜农『Pluto』专辑介绍|《Pluto》专辑制作的背后故事│陈乐融 银河面对面
- 【世界独家】华邦健康:北京华生康复医院自2022年9月正式开通医保服务以来,就诊人流量呈稳定上升趋势
X 关闭
行业规章
X 关闭