当前位置:首页>滚动 > >正文

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

  • 2023-04-23 03:10:10来源:腾讯云

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月21日,第二届中国(武汉)文化旅游博览会在武汉国际博览中心盛大启幕。恩施市

今日早餐怎么读英文?_早餐英文怎么读

1、早餐是用英语读的:英国的,美国的早餐拼音:zmocnL1:早餐发音:英语[早餐]美国[早餐]解释:是指早上

2023年全国青少年网球积分排名赛暨中国青少年网球巡回赛贵阳站开赛

(记者张伟)2023年全国青少年网球积分排名赛暨中国青少年网球巡回赛(贵州贵阳站)22日在贵阳市金阳网球中心开

【天天新要闻】斯穆奇去死_关于斯穆奇去死简介

1、《斯穆奇去死》是由丹尼·德维托执导的剧情片,RobinWilliams、EdwardNorton参加演出。2

GIOTTO是哪个国家的品牌_什么档次怎么样 环球快资讯

giotto品牌的代理商为上海溢捷网络科技有限公司,GITTO来自欧洲绘画艺术的故乡:意大利。我们有专注幼儿早

沭阳掼蛋网电脑版 沭阳掼蛋网

今天来聊聊关于沭阳掼蛋网电脑版,沭阳掼蛋网的文章,现在就为大家来简单介绍下沭阳掼蛋网电脑版,沭阳掼蛋

上汽集团(600104):上汽集团关于召开2022年度业绩说明会 天天观察

证券代码:600104证券简称:上汽集团公告编号:临2023-008上海汽车集团股份有限公司关于召开2022年度业绩

当前热讯:刚刚,《新闻联播》关注武汉这场盛会

刚刚央视《新闻联播》播发报道关注第二届中国(武汉)文化旅游博览会开幕第二届中国(武汉)文化旅游博览会

放飞“五一” |从淄博烧烤“出圈”看“五一”小长假出游潮流_天天热消息

放飞“五一”|从淄博烧烤“出圈”看“五一”小长假出游潮流

山西火石文化传媒有限公司_天天新要闻

1、山西火石文化传媒有限公司于2020年05月15日成立。2、法定代表人江勇,公司经营范围包括:文学创作;文艺

一季度 全省银行卡消费达6.3亿笔_天天头条

一季度全省银行卡消费达6 3亿笔

【天天报资讯】手表男士_男士彩妆教程

面部涂层遮瑕膏。在眼睛和鼻子下面的眼袋上多涂些bb霜。用cc霜完善脸部。调整眼睛和眉毛,画一些眼线。做出

水煮螃蟹的做法步骤_煮多长时间合适

欢迎观看本篇文章,小勉来为大家解答以上问题。水煮螃蟹的做法步骤,煮多长时间合适很多人还不知道,现在让

环球热资讯!顾建国:技术赋能 持续推进媒体融合发展

顾建国:技术赋能持续推进媒体融合发展

世界今亮点!徒手整形到底有没有效果_徒手整形应用的原理是什么

1、不必开刀削骨,仅凭双手的捏捏整整,就可以让人模样大变。2、徒手整形听起来有些玄乎,感觉像周星驰主演

法国外长科隆纳:若不与中国寻找共同点,如何能够向前发展? 天天实时

北京日报客户端|记者白波法国外长科隆纳日前在访问韩国期间发表讲话说,如果没有中国,世界的重大问题无法

学校美食节做什么好的小吃图片_学校美食节做什么好

1、学校的美食节可以做一些快手食物:番茄炒鸡蛋、拍黄瓜、寿司、土豆饼等。2、国内举办美食节的机构参差不

天天即时看!轰45+7献制胜抛投!布克创纪录之夜太狠 KD选择太阳不是没道理

轰45+7献制胜抛投!布克创纪录之夜太狠KD选择太阳不是没道理,威少,保罗,快船队,鲍威尔,美国篮球,凯文杜兰特

梦到鱼是什么意思 梦到鱼

今天来聊聊关于梦到鱼是什么意思,梦到鱼的文章,现在就为大家来简单介绍下梦到鱼是什么意思,梦到鱼,希望

一加产品经理周炳讯离职 每日视讯

集微网消息,一加产品经理周炳讯近日更新微博,表示已正式从一加离职,离职原因和离职后去向并未明说。在微

04月05日淮南前往贵港出行防疫政策查询-从淮南出发到贵港的防疫政策_环球观天下

04月05日淮南前往贵港出行防疫政策查询-从淮南出发到贵港的防疫政策(数据来源:本地宝)1、出淮南-部分地

北方将现大范围雨雪局地大暴雪,山西陕西局地或冷到破纪录

据中国天气网,今起三天(4月22日至24日),强冷空气继续影响我国,北方多地将有明显降雪天气,随着它南下

梅西取得本赛季第15次联赛助攻,五大联赛继德布劳内后第二人

梅西取得本赛季第15次联赛助攻,五大联赛继德布劳内后第二人,法甲,西甲,大联赛,首回合,里奥梅西,足球竞赛,

吃紧急避孕药为什么要吃维生素C_吃紧急避孕药为什么要吃维生素c 环球时讯

1、服用紧急避孕药会有很多副作用,有的人会恶心呕吐,有的人会月经改变。2、如果在服用紧急避孕药的同时服

绿研院日报 | 刘庆峰:AI服务健康中国“非用不可”。 环球观天下

今日《绿研院日报》摘要刘庆峰:AI服务健康中国“非用不可”。TCL华星赋能小米13Ultra。德福资本领投生工生

宝新金融拟配发8亿股,募资净额2.2亿港元主要用于还债

4月20日晚间,宝新金融(01282 HK)公告称,宝新金融集团有限公司与认购人中浩发展有限公司订立认购协议。

让互动更愉悦!食品饮料行业数字体验提升看这里 环球热点

“石楠拿铁“喝了吗?这款充满神秘气息的地方特调,让爱喝咖啡喝不爱喝的都沉默了。即便有着”天堂 地狱”

2300亿汽车巨头,净利骤降90%!

这也是长城汽车上市后第二次扣非净利润为负的单季,上一次出现亏损还是在2020年的一季度,当时其扣非净利润

全球快资讯:4月份沪牌拍卖结果公布 中标率11%

最低成交价92300元,平均成交价为92412元,比上个月92385元增加了27元

猜您喜欢

Copyright ©  2015-2022 华声服装网版权所有  备案号:京ICP备2021034106号-36   联系邮箱:55 16 53 8 @qq.com