Python面向对象编程-魔术方法-__call__和__getattr__方法 当前视讯
2023-04-22 20:42:33 来源:腾讯云

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__方法 当前视讯

2023-04-22

【天天新视野】杭州推公共交通出行优惠:学生半价,地铁公交换乘再优惠

2023-04-22

a4纸对折是多大尺寸_a4对折是多大

2023-04-22

环球速看:正式启动!快来为“安溪铁观音”点赞!

2023-04-22

资本预算是全国预算体系的中心环节_资本预算是全面预算体系的中心环节 对还是错|速读

2023-04-22

视讯!网王同人之宠儿 网王同人之无语

2023-04-22

詹金斯:莫兰特今日参加了非对抗训练 G3赛前决定是否复出

2023-04-22

员工回应公司要求卖宝马否则开除是什么情况|环球速看

2023-04-22

这球看得揪心亨利、维埃拉在看台上表情凝重-环球快资讯

2023-04-22

溧阳苏皖集团安置房4.15亿元ABS项目状态更新为“已反馈”

2023-04-22

高尔基童年人物关系图表-高尔基童年人物关系图

2023-04-22

中国航天发布三款商业液体火箭发动机 关注

2023-04-22

中斯签署共建南亚商贸物流中心协议

2023-04-22

华为P30 Pro手机壳:从选购到保养,全面解析 环球时快讯

2023-04-22

盛唐气象,泉城“新传”:走近唐三彩

2023-04-22

艾克森:渴望继续为国足出战 自律和努力让我越来越好|即时看

2023-04-22

特斯拉Model S/X汽车在美国涨价2500美元,今年来已三连降|天天精选

2023-04-22

梦见孩子丢了是什么意思(梦见孩子丢了是怎么回事)

2023-04-22

机械设备|资讯

2023-04-22

世界观察:宣汉县气象台发布雷电黄色预警信号【III级/较重】

2023-04-22

我国珍稀动物有哪些

2023-04-22

世界热议:【大国基理】天津:党建引领增强为民服务能力 绘就基层治理“同心圆”

2023-04-22

“五一”假期何处去,同程旅行实时榜单带你避开人潮_环球焦点

2023-04-22

张江高科:融资净偿还6918.95万元,融资余额8.78亿元(04-21)

2023-04-22

湘潭:抢抓预制菜风口 塑造赛道竞争力|环球热门

2023-04-22

东南电子:公司生产的微动开关可以应用到智能家居上 世界观速讯

2023-04-22

陕西安康:烟苗吐新绿 人勤春更早 世界报资讯

2023-04-22

【世界快播报】如何焯花生

2023-04-22

今日热讯:荣晟环保累计获得政府补助2215.41万元

2023-04-22

养家糊口男声完整版_养家糊口

2023-04-22

2023青岛机场巴士关于临时取消部分站点的通知_当前视讯

2023-04-22

《文字来找茬》大嫂卖车帮大嫂卖出100万通关攻略-焦点短讯

2023-04-22

洪都航空:4月21日融资买入3082.99万元,融资融券余额7.47亿元

2023-04-22

【当前热闻】最强火箭“星舰”为何爆炸,马斯克是失败还是成功了?

2023-04-22

又要罚?杨帆去年也因暴力行为染红,吃到五场禁赛+总计25万罚款

2023-04-22

秋季养生丨缓解咳嗽不只可以熬梨水,还有这些做法 天天报资讯

2023-04-22

焦点速讯:“骏马”刷新“丰城速度” 推动经济社会高质量发展

2023-04-22

环球快看:慕容复_关于慕容复的介绍

2023-04-22

第三届黑龙江省电梯行业职业技能大赛举行 当前讯息

2023-04-22

海外网评:敲错门竟遭枪击,美国社会“人人自危”|天天热头条

2023-04-22

荣耀首份 ESG 报告:2030 年实现碳达峰,2045 年 100% 使用可再生能源 世界报道

2023-04-22

全球热点!萌推怎么样_萌推怎么样

2023-04-22

珠江钢琴(002678):4月21日北向资金减持26.35万股

2023-04-22

紫晶存储处罚落地,中介机构先行赔付投资者损失

2023-04-22

日本警方确认岸田遇袭事件嫌疑人家中发现的粉末为黑火药

2023-04-22

全球百事通!今起至24日 大风降水强降温|联播服务台

2023-04-22

当日快讯:*ST泽达:触及重大违法行为,收拟终止公司股票上市事先告知书,4月24日起停牌-天天新视野

2023-04-22

运动会入场解说词霸气50字_运动会入场解说词古风

2023-04-22

麦格纳庆祝梅赛德斯G级车50万台产量里程碑

2023-04-22

异度之刃2天威谁用最合适_异度之刃2天威

2023-04-22

锄禾日当午的作者是谁_锄禾日当午原文

2023-04-22

今日热文:股票行情快报:中谷物流(603565)4月21日主力资金净卖出939.71万元

2023-04-22

共建行业数据交易平台 上海数交所与上海钢联签署战略合作协议

2023-04-22

年轻人“特种兵式”旅游或绕道“五一”假期-今日最新

2023-04-21

扁平比大好还是小好_扁平比 环球速看

2023-04-21

每日热闻!名片尺寸ps做多大_名片尺寸ps

2023-04-21

中国黄金: 中国黄金集团黄金珠宝股份有限公司关于2022年度利润分配预案的公告

2023-04-21

追梦禁赛!无绿勇击退国王总分扳成1-2,库里超神,小狐狸准三双 环球新视野

2023-04-21

环球短讯!不省人事的意思和造句_不省人事的意思

2023-04-21

全球热头条丨江西一小区起火,20余人被困!唯一逃生通道“被堵”

2023-04-21

英格兰左后卫伯特兰德与莱斯特城签约

2023-04-21

天天热议:聚光科技(300203)新增【太赫兹】概念

2023-04-21

醉驾处理过的车辆会被监控多久-每日视讯

2023-04-21

汉诺威工博会:体验科技魅力

2023-04-21

ST云城4月21日快速上涨

2023-04-21

天天新消息丨中信股份(00267.HK)发布中信特钢一季度业绩,净利润14.8亿元,同比下降24.01%

2023-04-21

焦点热门:4月21日吉林板块跌幅达2%

2023-04-21

重大事故!长峰医院紧急停牌! 世界今头条

2023-04-21

特工狂妃笑白小说

2023-04-21

焦点播报:关于安全生产,习近平总书记这样说

2023-04-21

华泰证券:黄金珠宝需求加速释放 板块格局清晰、优选领先龙头-最资讯

2023-04-21

天天亮点!新生儿落户被标注“文盲”?莫人为甩锅给系统

2023-04-21

数字经济|石家庄市引进的首家“独角兽”企业:优必选的筑梦时刻

2023-04-21

盘中异动 | 富国中证港股通互联网ETF跌2.14%

2023-04-21

本周钼市先抑后扬 成交活跃

2023-04-21

1/4美国学生滥用多动症药物提高成绩:恐导致抑郁辍学-环球信息

2023-04-21

全球热点!中国传统村落总数有多少个?中国已发布6批传统村落名单!

2023-04-21

环球今日讯!电四驱混动布局 比亚迪全新皮卡车型曝光

2023-04-21

临川区东馆镇中心小学开授“认识总体国家安全观”专题教育课

2023-04-21

娄底:首批市级地方标准发布实施

2023-04-21

5月可能出现首个影响海南省的热带气旋!今年或将受到个别较强台风影响

2023-04-21

中俄经贸与投资合作论坛在莫斯科举行——推动两国经济合作走深走实 世界热讯

2023-04-21

童年的树叶|天天动态

2023-04-21

上海市经济和信息化委:未来三年上海将建设200家智能工厂,探索智能制造“上海经验” 世界速看

2023-04-21

有什么花在冬天开放_冬天开什么花

2023-04-21

内饰很眼熟/配置还可以 沉浸式静态体验奇瑞瑞虎9-当前观点

2023-04-21

金融支持靠前发力 信贷投放量增价降——透视一季度金融数据“成色”

2023-04-21

世界微资讯!「加油!小镇」“小茶叶”成致富“金叶子”

2023-04-21

工信部支持湖北(襄阳)、浙江(德清)、广西(柳州)创建国家级车联网先导区|世界新视野

2023-04-21

东方雨虹战略投资北京建院 青矩技术

2023-04-21

【天天新视野】[快讯]华达新材公布年报

2023-04-21

北京国际电影节110部进境影片全部通关-天天热推荐

2023-04-21

【快播报】欧冠出炉了!拜仁查出头号罪魁祸首:手球得分+滑倒礼物,被哈兰德

2023-04-21

【世界新视野】新加坡GIC不动产收购华润北京万象城项目公司70%股份

2023-04-21

宁德时代一季度净利接近百亿,毛利率提高至20%以上

2023-04-21

北京:加快推进危旧楼房改建工作 天天滚动

2023-04-21

焦点滚动:龙津药业2022年营收1.23亿 董事长樊献俄薪酬88.49万

2023-04-21

全球今热点:凌钢股份:4月20日融资买入117.55万元,融资融券余额1.39亿元

2023-04-21

融资成本稳中有降信贷结构持续优化 不存在长期通缩或通胀基础

2023-04-21

销售人员的工作职责内容_销售人员的岗位职责|当前快讯

2023-04-21