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__方法 当前最新
- 单位未规范使用印章 不等于劳动合同无效
- 木头姐“知行合一”!继续加仓特斯拉(TSLA.US)并称到2027年将涨至2000美元
- 人民网评:“五个一百”,传递正能量、传播真善美_全球报资讯
- 我市设立“人才日” 环球即时
- 北京顺义区开展消防安全检查-观天下
- LPR报价连续8个月不变 天天日报
- 热点!榴莲批发价1斤低至20元事件简单介绍
- 环球即时:聚焦突出问题 开展消防整治
- 天天看点:丰泽区协调推进消费商圈优化提档等重点工作
- 舆情是什么意思呢_舆情是什么意思|当前头条
- 坚定初心谋发展 实干担当谱新篇|环球讯息
- 【全球新视野】地质局是公务员吗_地质局是什么单位
- 5G Dry耐水锁扣系统让生活安心无忧-要闻速递
- 个别地方高标准农田建设造假?农业农村部:认真核查、严肃处理
- 全球今日讯!国米官方:什克昨天接受了腰椎手术,未来几周将进行康复训练
- 当前资讯!神预言?穆帅两周前采访:罗马第三?你确定尤文没有59分?
- 全球速递!汽车零部件:轮胎售后服务标准亟待确定
- 黑芝麻因违规收监管函,事关6000万元增资款 天天视点
- 天天日报丨扶不起的阿斗!国乒裤裆门男主角输得窝囊,刘国梁现场督战黑脸
- 【世界新要闻】共话中国经济新机遇丨专访:看好在华发展前景,继续深耕中国市场——访采埃孚集团董事会主席、首席执行官柯皓哲
- 观察|美轰炸机首现中印边境地区参加演习,意欲为何?
- 发射失败!“星舰”空中失控爆炸!马斯克回应→
- 失眠的原因及解决方法_游泳眼镜起雾怎么解决
- 【天天速看料】广东队最新消息广东体育不播G2,最新名单出炉,任骏飞被放弃用
- 刘志仁与优秀党外干部座谈:发挥统一战线优势 书写好“共识”“担当”“清廉”答卷 天天热讯
- 热点!首度在北京大兴开航洲际客班,东航国际地区航线密集“上新”
- 扫描纸质版变成电子版_怎么把纸质版变成word
- 绿亨科技:拟10派1元,共派现1802.06万元-环球快播报
- 注入油气装备优质资产,三一国际(00631.HK)有望释放成长潜能
- 串换诊疗项目!北京安达医院被中断医保定点医院协议6个月-世界热资讯
- 陪跑国信证券24年,一汽投资拟“清仓”套现25亿! 环球速看料
- 世界滚动:XD芯能科(603105):4月20日北向资金增持4.14万股
- 野化放归朱鹮成功孵化第一窝鸟宝宝
- 个人中心ui i360cn个人中心
- 安泰科技(000969):安泰科技股份有限公司关于召开2022年度暨2023年第一季度网上业绩说明会 环球即时
- 视焦点讯!最多登录10小时,腾讯游戏发布五一假期未成年人限玩通知
- 上海银保监局:强化第三方数据安全评估 防范外部数据源合规风险
- 吴堡县气象台继续发布大风蓝色预警【Ⅳ级/一般】-世界观速讯
- 2023杭州市萧山区中医院编外人员招聘岗位|速看
- 吃海鲜可以喝啤酒吗 吃海鲜可以喝啤酒吗 好大夫
- 广东文旅消费补贴发放时间最新
- 热消息:龙岗紫和嘉园即将入市,推660套住宅,均价预计4万/㎡
- 全球热资讯!每日科技2022年净利435.64万 同比减少57.76% 上半年品牌商广告投放量减少
- 葫芦娃:海南全岛封关运作是自贸港建设具有里程碑意义的系统工程,是全面建设海南自贸港的基础-头条焦点
- 天天速递!知名女演员报警!嫌疑人已被警方控制
- sandboxie在窗口标题中显示沙盘名教程_天天微速讯
- 全球最新:中证协发布一季度券商债券承销业务专项统计 行业承销绿色债361.85亿元
- 当前滚动:五一车票预售火热,深圳至北京、武汉、杭州等方向热度高
- 镇平县石佛寺镇卫生院:开展安全隐患大排查-环球热门
- 贵州探险:74.8千米长的神秘大峡谷,堪称“地球上的裂痕”|当前信息
- LPR息率维持不变 策略师:当前信贷重点是结构 热点在线
- 科博达: 科博达技术股份有限公司2023年第一季度报告
- 1158万人!今年高校毕业生数量再创历史新高!找工作更难了...-全球微头条
- 组图|三亚:谷雨时节 南繁稻谷又飘香
- 2023年一级造价师《交通运输》巩固习题18
- 环球播报:长沙首批供地4宗熔断地块将于4月25日摇号 最多12家抢1宗地
- 片仔癀:公司一直在持续积极地推进信息化建设
- 家用办公游戏首选!27英寸大屏显示仅498元-天天热门
- ApplewatchOS10为AppleWatch带来重大改变 焦点速看
- 北京天坛游玩攻略-环球即时
- 天天播报:刘元春:中国经济并非通缩
- 一季度广东居民人均可支配收入出炉 这次你达标了吗?
- 中邮基金2022年净利6323.9万同比下滑35.7% 子公司管理费收入减少-天天视讯
- 全球热点评!什么是全资子公司?全资子公司与母公司的联系和区别是什么?
- 余承东称问界汽车降价降错了 华为应该专注中高端市场 环球今热点
- 天天速读:CIS上市公司龙头有哪些?(2023/4/20)
- 全球新动态:就在今晚!vivo折叠系列旗舰新品发布会亮点提前看
- 马斯克警告:人工智能或导致“文明毁灭”! 世界最资讯
- 中科云网(002306)4月20日主力资金净买入424.23万元-世界播资讯
- 土耳其内政部长:美国继续失去声誉,全球多地厌恶美国-今日报
- 环球看热讯:子洲县老君殿镇湫沟村扶贫互助资金协会
- 三闯港交所,主打性价比的乡村基如何夺魁“中式快餐第一股”?
- 贵阳周六福黄金多少钱一克(2023年4月19日)-世界时讯
- 网龙宣布将分拆海外教育业务于纽交所上市
- 姚笛36岁生日求婚成功,此心安处,便是乐也 焦点快报
- 每日热文:落落大方是什么属相_落落大方是什么意思
- 【全球聚看点】异地医保报销比例是多少?2023年异地医保报销范围是怎样的?
- 邮储银行副行长姚红:打造服务乡村振兴数字生态银行 当前时讯
- 数据分析师一定要考证吗(成为数据分析师需要考证书吗)|视焦点讯
- 天天速读:Cosmonic PaaS进入公开测试阶段
- 世界快看:立夏的风俗有哪些
- 每日观察!诗韵青春潮流地!西渡“滨江领客”联盟在熟人社区“营”未来!
- 营收同比增长超7%!江苏国企实现首季“开门红”
- 追悼志摩的意思_追悼志摩-全球视讯
- 辣椒炒鸡蛋_全球快资讯
- 一季度中国经济稳健前行 数据里彰显出大国经济的韧性与活力 今日热闻
- 中国国家发改委:将下大力气稳定汽车消费_每日视点
- 央行4月6日开展80亿元逆回购操作,公开市场实现净回笼4310亿元
- 环球今日报丨欧美银行危机、中国经济弱复苏趋势已现,投资者的钱应该放哪儿?
- 国家发改委:一季度良好开局充分展现我国经济韧性活力|当前关注
- 江铠同个人资料简介_江铠同个人资料介绍
- 世界焦点!中泰证券给予千味央厨买入评级 周期反转 势能向上
- 今日讯!英杰电气(300820.SZ):多晶类合同订单都是和下游硅料厂家签订 因此结算周期比较长
X 关闭
资讯
X 关闭