首页 > 资讯 >

环球要闻:Python面向对象编程-魔术方法-__call__和__getattr__方法

2023-04-23 04:17:52 来源:腾讯云

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__方法是用于实现对象可调用和属性访问的重要方法。

2023-04-23

今日精选:什么水果可以提高记忆力_苹果中含有增强记忆力的微量元素是

1、苹果中含有增强记忆力的微量元素锌。2、不是碳酸。本文分享完毕,希望对大家有所帮助。

2023-04-23

环球今热点:全市法院财物统管改革问需会召开

4月20日,全市法院财物统管改革问需会在高新法院召开,此次会议旨为进一步摸清工作情况,了解财物统管改...

2023-04-23

全球快消息!黄石住房公积金官网_黄石公积金查询系统

1、查询个人住房公积金账户信息。2、可以通过下列途径查询:登陆当地住房公积金网站查询;2、到公积金管...

2023-04-23

世界观速讯丨kimoji_日语什么意思

也就是说,持有:1 心情。情感。心。心情的感受2 感情。感觉,感觉3 心。感激和同情的适度表达4 (用...

2023-04-23

新消息丨【央广时评】激浊扬清 让网络空间更加“清朗”

2023年中国网络媒体论坛如期举行,其中平行论坛主题——“激浊扬清·共建亿万网民新家园”,在会场内外...

2023-04-23

环球关注:北展剧场能容纳多少人_北展剧场

1、上周刚去的北展剧场。2、每场演出票价可能会有点差异吧。3、但是总体的原则就是越往前排越贵啦。4、...

2023-04-22

观焦点:现代安全帽的发明是受到了什么动物的启发_安全帽的发明是受到了啄木鸟的启发

欢迎观看本篇文章,小柴来为大家解答以上问题。现代安全帽的发明是受到了什么动物的启发,安全帽的发明...

2023-04-22

观焦点:MSI夺冠难度,比S赛冠军更大!14场BO5史无前例,观众成最大赢家

但从另外一个角度来说,MSI还存在有冠军归属的偶然性,因为按照正常赛制打,MSI的淘汰赛胜者组冠军,就...

2023-04-22

环球快消息!世界地球日:以爱为名,守护“你”

2023年4月22日是第54个世界地球日,宣传主题为“珍爱地球人与自然和谐共生”。仰望夜空,星河灿烂。地球...

2023-04-22

全球快讯:瓜导新片《酷儿》选角 德鲁·斯塔基将出演男主

1905电影网讯由导演卢卡·瓜达尼诺执导,丹尼尔·克雷格主演的新片《酷儿》,再度公布了新演员加盟的消...

2023-04-22

世界快消息!拼班

1、拼班是一个整合教育资源和用户资源的教育类O2O信息服务平台,产品定位于“拼在一起,团购知识”,让...

2023-04-22

天天信息:清洁工花三月工资给孩子买手机_店家称孩子坚持要iPhone14 网友:子不教父之过

原标题:清洁工花三个月工资给孩子买iPhone14Pro店家:现在孩子怎么了月薪三千,你会给家人买接近万元的i

2023-04-22

环球新资讯:陕西宝鸡一季度城镇新增就业1.1万余人

陕西宝鸡一季度城镇新增就业1 1万余人

2023-04-22

当前快讯:qq相册回收站删除的照片怎么找回_qq相册回收站删掉的照片怎么恢复

1、手机QQ已删除照片恢复教程  一、将您的手机QQ升级到最新版;  二、点击头像,看到左下角的设置; 

2023-04-22

热门:书香东胜,金龟子助力!今天约2万人齐聚这里!

书香东胜,金龟子助力!今天约2万人齐聚这里!

2023-04-22

当前要闻:女子称电视机凌晨突然飙女高音,客服:可能是wifi被他人连接并在电视投屏

女子称电视机凌晨突然飙女高音,客服:可能是wifi被他人连接并在电视投屏---据沸点视频报道,4月21日凌...

2023-04-22

天天热推荐:仅用110天 成达万高铁全线首座隧道贯通|全力以赴拼经济搞建设

仅用110天成达万高铁全线首座隧道贯通|全力以赴拼经济搞建设封面新闻记者曹菲摄影报道4月22日上午10点1...

2023-04-22

焦点热议:CCTV5直播,广东VS广厦生死战,杜锋应主动变阵,辽篮收渔翁之利

CCTV5直播,广东VS广厦生死战,杜锋应主动变阵,辽篮收渔翁之利,杜锋,广东,广厦,辽篮,辽宁飞豹,北京首钢...

2023-04-22

环球快消息!前半生2什么时候上映电视剧_前半生2什么时候上映

1、中文名我的前半生出品时间2016年出品公司新丽电视文化投资有限公司制片地区中国大陆拍摄地点上海首播...

2023-04-22

每日时讯!您可以在颗粒炉中燃烧木屑吗?_第一次送女朋友生日礼物送什么比较有意义

颗粒被制成自动流入颗粒炉。虽然在颗粒炉中燃烧木屑在逻辑上是可行的,但这不是一个非常简单或实用的选...

2023-04-22

全球今日报丨战前三预兆:大规模军演,大规模撤侨,大规模舆论,是该出手了!

战前三预兆:大规模军演,大规模撤侨,大规模舆论,是该出手了!,军演,战争,台海,张召忠,军事基地,战前...

2023-04-22

实时:氢氧化钙变质过程_氢氧化钙变质的化学方程式

1、Ca(oH)2+CO2=CaCo3+H2O氢氧化钠会吸收水和二氧化碳变质。本文分享完毕,希望对大家有所帮

2023-04-22

当前热议!俱乐部搬迁长沙申请被足协拒绝,四川九牛发声明

新京报讯4月22日,四川九牛足球俱乐部就“俱乐部由成都搬迁至长沙被足协终止并拒绝”一事发布声明,以下...

2023-04-22

快讯:北京部署开展规范旅游市场价格秩序专项执法行动

央视新闻客户端|作者陈宝善为进一步规范首都旅游市场价格秩序、切实维护消费者合法权益,北京市市场监督...

2023-04-22

当前快讯:国产CPU出口海外 整机已适配

天天时讯:促进交流互动 深化文旅合作 盐城市盐都区在苏州举办文旅推介招商活动

全球新消息丨跨境资金流动平稳 外资保持净流入态势——外汇局解读一季度外汇市场形势

【新要闻】济宁任城区吉祥社区开展“清洁家园美化环境”志愿服务活动

天天最新:NBA综合:76人三连胜 勇士扳回一城

天天热讯:我发现互联网工作的性价比还在持续走低,没看到好转的迹象

世界热资讯!陕北,你未曾见过的地球脉动

世界快资讯:2022 年派对上你会想要的 9 种饮料机

即时焦点:东华大学旭日工商管理学院怎么样_东华大学旭日工商管理学院

即时:耳石症有什么症状表现(中年人头晕是什么原因引起的)

环球滚动:《守护者与公主》第四百六十四章 能不能别拿我的金币啊

全球消息!足坛遗憾2:自诩为“上帝”的伊布,居然拿不到一座欧冠?

今日视点:孔天胤评传

每日视点!女模大胆穿c字裤走秀夹好_美女穿c字裤走秀

全球球精选!韦斯特布鲁克拿过总冠军吗_韦斯特布鲁克

天天热资讯!立昂技术:公司的数据中心机房以及云服务业务为算力提供基础数据存储及服务支持

环球新消息丨奥浦迈:4月21日融资买入403.16万元,融资融券余额4204.08万元

天天速讯:旧巢共是衔泥燕飞上枝头变凤凰是什么意思_旧巢共是衔泥燕飞上枝头变凤凰的含义

环球新消息丨天津创业房租补贴什么情况会暂停发放?

【环球新要闻】qq个性空间免费(qq个性空间)

环球头条:景甜“私密视频”风波后首次晒自拍,暗示一切雨过天晴

天天新资讯:布署和部署有什么区别图片-布署和部署有什么区别

环球聚焦:宝马MINI再道歉老外是同事详细内容

天天热消息:海晨股份(300873.SZ):2022年净利同比增长15.81% 拟10派3.5元

世界今头条!如何保持奶酪吸管清脆

Copyright @  2015-2022 东方家电网版权所有  备案号: 沪ICP备2020036824号-8   联系邮箱:562 66 29@qq.com