当前位置:首页  >  行业资讯  > 正文

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

实时:Python面向对象编程-魔术方法-__call__和__getattr__方法
2023-04-23 10:49:21 来源:腾讯云

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

标签:

(责任编辑:news01)
实时:Python面向对象编程-魔术方法-__call__和__getattr__方法

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

Python中的魔术方法__call__和__getattr__方法是用于实现对象可调用和属性访问的重要方法。
04-23 10:49:21
当前信息:2023年一季报点评:业绩基本符合预期,长期看好公司

当前信息:2023年一季报点评:业绩基本符合预期,长期看好公司

2023年一季报点评:业绩基本符合预期,长期看好公司
04-23 10:03:53
全球报道:围炉冰茶又火了,年轻人为何钟情围炉?

全球报道:围炉冰茶又火了,年轻人为何钟情围炉?

“来一桌围炉冰茶,看云雾吞吐;配几碟江南点心,品花开花落”。这句意境空灵的文案在短视频平台、社交媒...
04-23 09:44:32
世界观点:少年心事当拿云谁念幽寒坐呜呃翻译(少年心事当拿云谁念幽寒坐鸣)

世界观点:少年心事当拿云谁念幽寒坐呜呃翻译(少年心事当拿云谁念幽寒坐鸣)

1、李贺的《致酒行》这是首困居异乡感遇的诗词,音情高亢,表现明快,别具一格。2、以抒情为主,却运用...
04-23 09:17:05
环球动态:日本民众集会要求返还从中国掠夺的文物

环球动态:日本民众集会要求返还从中国掠夺的文物

新华社东京4月22日电由日本有识之士组成的“中国文物返还运动推进会”22日在东京组织集会,呼吁日本社会...
04-23 09:04:12
每日资讯:男子桥上跌落后离奇失踪7天,人找到了,还活着但……

每日资讯:男子桥上跌落后离奇失踪7天,人找到了,还活着但……

14日凌晨,浙江杭州富阳38岁的男子和朋友喝酒后失联。朋友和家人联系不到他,报了警。警方查看公共视频...
04-23 08:30:28
环球热门:遇到烂尾楼只能认倒霉?事关退款,最高法最新明确了!

环球热门:遇到烂尾楼只能认倒霉?事关退款,最高法最新明确了!

遇到烂尾楼,弱势的购房人终于有了护身符。4月20日,最高人民法院就河南省高级人民法院《关于明确房企风...
04-23 08:10:34
天天新消息丨河南洛阳大学放假_河南洛阳大学

天天新消息丨河南洛阳大学放假_河南洛阳大学

1、学校的前身是洛阳市教育学院和洛阳市走读大学,这个时候是1980年。2、到了1983年两所学校进行了合并...
04-23 07:58:49
世界热文:开局起步看信心——今年一季度我国经济社会发展述评

世界热文:开局起步看信心——今年一季度我国经济社会发展述评

【开局起步看信心——今年一季度我国经济社会发展述评】4月18日,国家统计局发布一季度国民经济运行情况...
04-23 07:01:19
环球今热点:通信网络架构是什么_通信网络架构

环球今热点:通信网络架构是什么_通信网络架构

1、分配层有时也被称作是工作组层,它是接入层和核心层之间的通信点。2、分配层的主要功能是提供路由、...
04-23 06:29:15
【全球播资讯】河北省安全生产条例第13条规定原文内容?

【全球播资讯】河北省安全生产条例第13条规定原文内容?

生产经营单位应当具备下列安全生产基本条件:(一)有健全的安全生产规章制度和操作规程;(二)生产经营场所...
04-23 06:02:10
世界观察:微服务 - 搭建Consul集群服务,Consul配置中心

世界观察:微服务 - 搭建Consul集群服务,Consul配置中心

配置中心如何解决的呢?配置中心的思路是把项目中的配置参数全部放在一个集中的地方来管理,并提供一套标...
04-23 05:24:42
环球微速讯:哂纳的拼音_哂纳

环球微速讯:哂纳的拼音_哂纳

1、哂纳:1,是谦虚的说法。2、 笑纳,套语,用于赠送礼品,请人收下的谦词2 讥讽侵吞他人财物。3、一般...
04-23 04:59:52
当前关注:罗云熙白鹿杂志合体,激情热吻,网友不忍直视!

当前关注:罗云熙白鹿杂志合体,激情热吻,网友不忍直视!

文 桔彤2023年,对于娱乐圈内而言,真是好戏不断呢,先后有多部新剧问世,其中包括《狂飙》,《三体》...
04-23 04:14:28
世界快资讯:当日快讯:紫光股份旗下新华三与复旦大学微电子学院达成战略合作

世界快资讯:当日快讯:紫光股份旗下新华三与复旦大学微电子学院达成战略合作

据新华三官微,4月21日,复旦大学微电子学院与紫光股份旗下新华三集团签署战略合作备忘录。未来,双方将...
04-23 03:56:37
世界通讯!从租计征房产税如何计算应纳税额_从租计征房产税如何计算

世界通讯!从租计征房产税如何计算应纳税额_从租计征房产税如何计算

1、按照税法规定,对于出租的房屋,以租金收入为计税依据。2、  房屋的租金收入,是房屋产权所有人出...
04-23 02:37:11
每日视讯:中疾控:4月14日至4月20日,新发现275例本土重点关注变异株

每日视讯:中疾控:4月14日至4月20日,新发现275例本土重点关注变异株

对比4月15日中疾控公布数据,4月14日至20日,新发现本土重点关注变异株275例
04-23 02:05:44
【聚看点】滑板基础动作入门_滑板基础动作名称

【聚看点】滑板基础动作入门_滑板基础动作名称

1、你好板友,新手知道的动作名称有以下的就可以了,我们内蒙板友一般都这么叫。2、可能有些许不同,不...
04-23 01:08:18
微资讯!xp系统解压缩软件_xp系统去广告软件哪个好

微资讯!xp系统解压缩软件_xp系统去广告软件哪个好

1、,清理系统垃圾很不给力 比如360安全卫士,金山卫士,优化大师,超级兔子等 给你介绍几个给力的国外清...
04-23 00:53:03
全球快看点丨2023上海车展:新款好猫GT木兰版上市 售价14.38-15.38万元

全球快看点丨2023上海车展:新款好猫GT木兰版上市 售价14.38-15.38万元

2023上海车展中,2023款欧拉好猫GT木兰版正式上市,共计推出2款配置车型,官方指导价14 38-15 38万元...
04-23 00:32:59
全球观察:roi理论是谁提出的_roi理论

全球观察:roi理论是谁提出的_roi理论

1、returnoninvestment的缩写吧。2、ROI=(投资收益-投资成本) 投资成本就是说,在投资决策
04-22 23:32:11
每日视讯:统景风景区_关于统景风景区介绍

每日视讯:统景风景区_关于统景风景区介绍

1、统景风景区位于重庆市渝北区东部御临河畔,方圆15平方公里,距渝中区65公里、重庆江北国际机场仅38公...
04-22 22:50:11
全球关注:幸好没来LPL,不然就难受了,Faker前队友感叹,差点和宁王同队

全球关注:幸好没来LPL,不然就难受了,Faker前队友感叹,差点和宁王同队

LOL最近几年的转会期,选手的失业情况愈发严重,一般来说,对于那些年纪大的,非顶级的表现比较中庸的选...
04-22 22:35:08
世界热消息:女孩升职被同事造黄谣抑郁后裸辞 未来打算自己创业不再卷入职场

世界热消息:女孩升职被同事造黄谣抑郁后裸辞 未来打算自己创业不再卷入职场

4月19日(采访时间),北京。95后女生夏夏在一家公司做短视频运营,后来升职成为项目经理,同夏夏竞争的...
04-22 21:38:23
【当前独家】四川九寨沟“4·19”森林火灾已成功处置 无人员伤亡

【当前独家】四川九寨沟“4·19”森林火灾已成功处置 无人员伤亡

记者从四川省阿坝州九寨沟县森林草原防灭火指挥部获悉:4月19日九寨沟县黑河镇羌活沟村森林火情发生后,...
04-22 21:28:03
环球微动态丨花呗当面花怎么用_花呗当面花用法简述

环球微动态丨花呗当面花怎么用_花呗当面花用法简述

欢迎观看本篇文章,小柴来为大家解答以上问题。花呗当面花怎么用,花呗当面花用法简述很多人还不知道,...
04-22 20:56:48
全球微速讯:90后成第一批出境游客主力军具体是什么情况

全球微速讯:90后成第一批出境游客主力军具体是什么情况

很多人对90后成第一批出境游客主力军具体是什么情况比较关心,现在让我们一起来瞧瞧具体是什么情况吧!1...
04-22 20:29:03
【环球快播报】湖北宜昌伍家岗:狠抓移风易俗 劲吹廉洁文明新风

【环球快播报】湖北宜昌伍家岗:狠抓移风易俗 劲吹廉洁文明新风

湖北宜昌伍家岗:狠抓移风易俗劲吹廉洁文明新风
04-22 20:16:03
焦点要闻:方便面泡多久(方便面泡多久合适)

焦点要闻:方便面泡多久(方便面泡多久合适)

1、方便面一般泡3分钟左右。2、方便面又称快餐面、泡面、即食面等,是通过对切丝的面条进行蒸煮、油炸,...
04-22 19:22:54
【环球快播报】(体育)足球——女超联赛:武汉车谷江大胜北京

【环球快播报】(体育)足球——女超联赛:武汉车谷江大胜北京

(体育)足球——女超联赛:武汉车谷江大胜北京
04-22 18:49:00

精彩推送