首页 >资讯 > > 正文

Python面向对象编程-魔术方法-__call__和__getattr__方法

腾讯云 2023-04-23 11:09:17

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方法)来实现。

上一篇:优化“15分钟政务服务圈” 我省出台政银合作网点建设规范 每日精选 下一篇:最后一页
x
推荐阅读

Python面向对象编程-魔术方法-__call__和__getattr__方法

2023-04-23

优化“15分钟政务服务圈” 我省出台政银合作网点建设规范 每日精选

2023-04-23

三角形面积公式 三角形面积-今热点

2023-04-23

快消息!山东提升文旅体验 拓展消费空间

2023-04-23

大立科技董秘回复:关于订单相关信息,公司严格按照有关法律法规的规定和单一合同金额标准,及时履行信息披露义务

2023-04-23

读书 | “第二大脑”:借势者智,借“脑”者王

2023-04-23

“医药女神”葛兰一季度规模跌破900亿:依然看重行业创新 加仓恒瑞医药|世界快讯

2023-04-23

世界热门:怎么让80岁老人勃起(老人勃起方法)

2023-04-23

新闻8点见丨北影节盛大启幕;铁路部门五一假期增开旅客列车1500多列

2023-04-23

一季度规模暴增超900%!冠军基金经理蔡嵩松:人工智能浪潮不可逆 或将成为未来最强产业趋势 世界快播报

2023-04-23

无视市场恐慌,欧洲激进加息50基点!官方这样解释-天天播资讯

2023-04-23

海南共和:植绿补绿 呵护美丽家园

2023-04-23

中甲东莞莞联VS无锡吴钩首发:冯潇霆先发登场、苏士豪&文达在列|全球聚看点

2023-04-23

一用即沦陷,韶音OpenFit真的是我用的最舒适的耳机啦!|快播报

2023-04-23

绿色的寓意和象征意义_绿色的寓意

2023-04-23

舒国滢法理学导论(第3版)考研真题题库资料

2023-04-23

以书交友 重庆新华书店快闪店来了 每日速读

2023-04-23

焦点速看:Python线程-线程的创建和使用

2023-04-23

微动态丨大写数字一到十怎么写_大写数字一到十如何写呢

2023-04-23

天天热讯:未来几年,部分退休老人或将面临同样的“困境”?原因很真实

2023-04-23

斯皮罗普洛斯_关于斯皮罗普洛斯简介 环球要闻

2023-04-23

世界信息:图吧地图手机版下载_图吧地图

2023-04-22

嘉宝果树的种植技术 嘉宝果的种植技术是怎样的

2023-04-22

当前速读:世界气象组织

2023-04-22

不回皇马,拒绝巴黎!齐达内下家曝光,担心姆总霸道,去二线豪门|每日时讯

2023-04-22

新平彝族傣族自治县气象台发布高温预警信号橙色预警【Ⅱ级/严重】【2023-04-22】

2023-04-22

山西清志微新型建材有限公司

2023-04-22

不忘初心来时路,广师大举办纪念汪达之先生诞辰120周年暨学术研讨会活动

2023-04-22

精密度和准确度的区别_精密度

2023-04-22

世界新动态:福特猛禽6x6怪物巴士是真实的来自俄罗斯的爱

2023-04-22

我为群众办实事丨小区物业突然砍伐四棵大树 鄠邑区住建局回应|看点

2023-04-22

【环球时快讯】南京交通大学刘梦亿事件_南京交通大学

2023-04-22

当前聚焦:泡泡玛特董事长兼CEO王宁:商业启蒙来自父母,青年豫商走到哪都心系家乡丨豫商有话说

2023-04-22

正宗四川泡椒鸡爪_柠檬泡椒鸡爪正宗制作方法 独家

2023-04-22

杰伦-格林:下赛季我们将进入季后赛 明年将是完全不同的一年

2023-04-22

家用空调如何选择_如何选择空调|环球热资讯

2023-04-22

法布雷加斯老婆_法布雷加斯女友_天天最资讯

2023-04-22

世界微速讯:串标围标怎么取证 串标

2023-04-22

焦点快看:淄博“烧烤贷”出圈!多家银行推出特色贷款,最高可贷100万,当天可放款

2023-04-22

五大联赛效力当前球队最久球员榜:布斯克茨居首,穆勒次席 微头条

2023-04-22

世界实时:两支意甲球队跻身欧联杯四强

2023-04-22

世界资讯:【招银研究|资本市场快评】如何看待港元汇率的弱势?

2023-04-22

今日观点!沙特阿美入股荣盛浙石化后,访谈会议记录曝光!

2023-04-22

易缘网官网_易缘网

2023-04-22

天天速看:Consul 的特点和优势

2023-04-22

世界快看:奔向各地春色、点燃消费热情——旅游专列人气旺

2023-04-22

图解粤电力B一季报:第一季度单季净利润同比增119.71%|天天微动态

2023-04-22

首飞爆炸 美重型运载火箭“星舟”任重道远

2023-04-22

东莞社保咨询电话12333人工服务时间(东莞社保电话人工服务电话)

2023-04-22

智能纺织品开发与应用_对于智能纺织品开发与应用简单介绍|焦点报道

2023-04-22

除夕巧逢立春,春天真的来了吗?

2023-04-22

武汉狂降20℃+9级阵风!反转就在…… 当前快播

2023-04-22

全球速递!穗港澳青少年文化交流季成果在穗展演

2023-04-22

【新要闻】数据中心降碳成刚需 英特尔全链条激活“绿色计算”落地

2023-04-22

天天即时看!子长小区

2023-04-22

我本楚狂人凤歌笑孔丘的含义_我本楚狂人凤歌笑孔丘 今日热文

2023-04-22

环球微速讯:温州市委副秘书长、办公室主任木力莅临浙江长城调研交流

2023-04-22

天天快报!华泰证券:4月21日融资买入1.15亿元,融资融券余额41.81亿元

2023-04-22

一汽大众第2300万台动力总成下线 世界热闻

2023-04-22

世界观焦点:古代女子为何“卖身葬父”?随便挖个坑不行吗?真实原因很复杂!

2023-04-22

2023广州白云区教育指导中心管辖范围及招生咨询电话

2023-04-22

甘蔗水怎么熬?

2023-04-22

猫眼娱乐(01896.HK):4月21日南向资金增持45.28万股

2023-04-22

三尺剑一戎衣_三尺剑

2023-04-22

梅西本场数据:1次助攻3关键传球,SofaScore评分7.7 速看

2023-04-22

一批航天科技成果集中亮相 航天技术产业落地助力区域经济发展_简讯

2023-04-22

热点评!海牛客场战平河南!保级路上每个积分都弥足珍贵

2023-04-22

双倍浪漫来袭:天琴座流星雨与“星月童话”同现天宇_世界微速讯

2023-04-22

微头条丨今日演员 薛之谦 歌曲_演员薛之谦歌词

2023-04-22

世界速读:河北省委常委会(扩大)会议召开 倪岳峰主持并讲话

2023-04-22

观焦点:大冷!世界第一樊振东2-3输外战出局,19岁法国小将偷笑狂喜

2023-04-22

安徽理工大学校长袁亮:推动行业特色地方高水平大学高质量发展|每日热闻

2023-04-22

办事别跑空!国家税务总局郑州市金水区税务局办税服务厅搬迁啦 环球速讯

2023-04-22

河南中原高速公路股份有限公司2023年3月份通行费收入和交通量数据公告

2023-04-22

黛蜜儿慕晚小说 黛蜜儿 全球新要闻

2023-04-22

头条焦点:信用卡分期账单提前还款是真的吗?信用卡分期后提前还款会怎样

2023-04-22

环球微速讯:矫正机

2023-04-22

丝竹是指什么_丝竹简介_焦点速讯

2023-04-22

通用技术代表作品设计与制作(通用技术代表作品)

2023-04-22

股票行情快报:陕西黑猫(601015)4月21日主力资金净卖出1170.97万元

2023-04-22

环球即时:卫冕冠军认真起来有多可怕?库里卢尼攻防教国王做人

2023-04-22

乌当区公安分局:为民服务有实招 惠民政策提效能

2023-04-21

实名曝光色狼处罚结果,到底该不该?

2023-04-21

“史上最大最强力火箭”星舰二次试射升空4分钟后爆裂

2023-04-21

速递!MINI冰淇淋事件发酵,它和宝马是什么关系?

2023-04-21

世界观焦点:党员干部违纪违规检讨书_违纪检讨书写给纪委

2023-04-21

沉寂与静寂的意思_静寂的意思

2023-04-21

微速讯:你能用爱尔兰燕麦片代替燕麦片吗?

2023-04-21

【环球速看料】汉王科技频被问询 财报“异常”、NLP培育在路上 股价能火多久?

2023-04-21

使用权属于知识产权吗-播资讯

2023-04-21

外汇局:一季度外资投资境内证券总体呈现净流入

2023-04-21

全球聚焦:东方智造:拟聘任陈斌先生为公司总经理

2023-04-21

2023年东莞各镇区老年人免费体检安排汇总

2023-04-21

看点:开心消消乐730关怎么过方法详解_开心消消乐730关怎么过

2023-04-21

当前快报:东方日升与ENERIS签订战略合作协议

2023-04-21

匡威标志logo_匡威标志_世界观热点

2023-04-21

伤员+1!中超卫冕冠军连折四员大将,实力受损严重,开局两场不胜-环球信息

2023-04-21

保育教师工作总结300字(实用3篇)

2023-04-21

财报速递:厦门国贸2022年全年净利润35.89亿元,总体财务状况一般

2023-04-21

纽约金价20日上涨 每日速看

2023-04-21