首页 > 电视 > > 正文

Python面向对象编程-魔术方法-__call__和__getattr__方法_天天最资讯

2023-04-22 16:15:12 来源:腾讯云

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-22 16:15:12

成都蓉城回应沧州雄狮球员被砸:强烈谴责,进行严肃调查! 每日讯息

成都蓉城回应沧州雄狮球员被砸:强烈谴责,进行严肃调查!,蓉城,成都市,沧州雄狮,中超联赛

2023-04-22 16:08:46

46投11中!面包:我们得在三分对彪局中做得更好 对出手选择满意|头条焦点

46投11中!面包:我们得在三分对彪局中做得更好对出手选择满意,勇士,面包,迈克-布朗

2023-04-22 15:41:49

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

新华社科伦坡4月22日电(记者车宏亮)中国招商局港口控股有限公司、斯里兰卡港务局和当地一企业21日在科...

2023-04-22 15:09:16

仅20多套,天河源著、和颂销售数据曝光,西派粤府备案价据说9万

来看下广州豪宅销售的真实数据,截止本周一收到的最新情报:世纪金源·天河源筑内部已开,实际去化仅20...

2023-04-22 15:08:02

土豆美食大挑战!三道创意地道土豆美味,口感绵软Q弹 焦点速递

土豆是非常常见的食材,不仅口感丰富,而且具有很高的营养价值。在餐桌上,人们大多将土豆做成炒丝这类...

2023-04-22 14:31:44

太热mv_太热

1、血分有热引起血热,临床以血液妄行,发热,甚则神昏等为主要表现的证候。2、常见于温热病、血证、月...

2023-04-22 14:20:12

尹力走进医院、工地、化工企业,检查安全生产隐患大排查大整治工作_环球新资讯

结合医疗机构特点,深入细致开展安全生产隐患大排查大整治,对诊室病房等重点区域加强检查巡查,对用电...

2023-04-22 13:42:21

昆明世青学校:云南第一所IB世界校 环球微速讯

我们是谁?昆明世青学校(KWYA)是独立法人的非营利性民办学历制学校,是北京世青唯一分校,是云南第一...

2023-04-22 13:03:00

知道姓名怎么查微信(知道姓名怎么查手机号)

1、知道名字就不能查手机号,这涉及隐私。2、我国使用的号码为11位,其中每一段都有不同的编码方向:网...

2023-04-22 12:36:46

俄媒:俄外交官称,俄可能考虑在西部边境部署中程和远程弹道导弹

俄罗斯外交部无任所大使格里戈里·马什科夫在为《国际生活》杂志撰写的一篇文章中表示,俄罗斯可能会重...

2023-04-22 12:12:18

快资讯丨教你画像素画每周分享232期

教你画像素画每周分享232期摘要:教你画像素画每周分享,本周全网精选像素画Top10。关键词:教你画,像...

2023-04-22 11:44:57

【全球热闻】宁德时代驶入无人区

两件大事

2023-04-22 11:41:20

每日快看:黄金大劫案!价值1亿的黄金 在机场离奇消失

又一起黄金大劫案!当地时间4月20日,一个装有价值超过2000万加元(约合人民币1亿元)黄金和其他贵重物...

2023-04-22 11:34:57

隔夜美股 | 三大指数上涨 Lyft(LYFT.US)涨超6% 当前快讯

智通财经APP获悉,投资者等待美国利率和经济前景相关的更多数据线索,美股周五表现较淡。三大股指全天维...

2023-04-22 11:08:18

明日雄鹿VS热火G3 字母哥因背部伤势出战成疑

明日上午7点30分,季后赛首轮G3,雄鹿将客场挑战热火。雄鹿官方今日更新了球队伤病名单。

2023-04-22 10:28:47

最高法批复商品房消费者权利保护相关问题-热议

批复二条提到:商品房消费者以居住为目的购买房屋并已支付全部价款,主张其房屋交付请求权优先于建设工...

2023-04-22 10:20:15

全球新动态:日本物价不断上涨 民众生活压力大增

国际在线报道(记者何欣蕾郭晓明):随着日本物价的不断攀升,普通民众的生活受到很大的影响。日本近期...

2023-04-22 10:02:39

凌志软件:4月21日融资买入494.34万元,融资融券余额8401.75万元

4月21日,凌志软件(688588)融资买入494 34万元,融资偿还798 85万元,融资净卖出304 5万元,融资余额8401 75万元。

2023-04-22 09:27:36

指导价42.78-53.13万元 全新奔驰GLC正式上市

2023上海车展开幕首日,全新奔驰GLC正式上市,共推出260L动感型、260L豪华型、300L动感型、300L豪华型四...

2023-04-22 08:49:13

网红饭的做法_网红饭的做法介绍|当前要闻

欢迎观看本篇文章,小勉来为大家解答以上问题。网红饭的做法,网红饭的做法介绍很多人还不知道,现在让...

2023-04-22 08:43:57

洗脸巾洗脸有什么好?

1、用于卸妆如果是用洗脸巾来卸妆,用法是将洗脸巾折叠三次,然后在洗脸巾上倒一些卸妆水即可用来卸妆,...

2023-04-22 08:07:00

环球今热点:当虹科技(688039)4月21日主力资金净卖出8110.48万元

截至2023年4月21日收盘,当虹科技(688039)报收于61 01元,下跌8 56%,换手率5 81%,成交量4 67万手,成交额2 97亿元。

2023-04-22 07:36:01

石家庄金至尊黄金价格多少钱一克(2023年4月21日)

金投黄金网4月21日讯,石家庄黄金价格_石家庄金至尊最新黄金价格 

2023-04-22 07:16:26

世界信息:关于幼儿园社会教育的调研报告-关于幼儿园社会教育调查报告

1、调查方法我们在全区调查了区属不同性质的幼儿园。2、调查对象:中班4-5岁幼儿200名。3、调查以开封市...

2023-04-22 07:15:55

热头条丨长沙法院两年受理涉银行业金融案件55261件

【世界时快讯】今日液化气减压阀调节开关漏气_液化气减压阀调节图解

湖南机电职院:国贸专业访企拓岗活动促进校企交流

闵行这处动迁安置房基本建成 邀请业主回家“预看房”

每日消息!银河系最新“体重”来了!我天文学家为银河系精确“称重”

[直击业绩会]孚日股份:保持家纺主业全球领先地位 优化产业布局加速新旧动能转换 环球关注

天天微资讯!刚刚,宝马MINI再道歉!网友怒了:一个标点符号都不信!

【全球播资讯】silhouette诗乐(silhouette)

世界新资讯:农夫山泉首推大柠檬饮料新品;喜茶联合11城文旅局推出城市文旅冰箱贴;Babycare ×「小猪佩奇」推出联名款新品|消研所周报

“重启关系”,卢拉开启访欧之旅_焦点日报

一份心愿书单的旅程(读书日特别报道) 全球时快讯

新光光电去年净利亏损2467万元 2019年上市募资9.5亿_当前讯息

电脑重启后移动硬盘电脑读不出来_移动硬盘电脑读不出来

前沿资讯!数字驱动 智能未来 2023泰尔英福合作伙伴大会成功举办

预算5万,该如何选择一个更舒服的车?

国家统计局:2023年1—3月份全国房地产开发投资同比降5.8%|快播

结转发出产品成本会计分录(结转发出商品会计分录)|天天播资讯

漳州发展:2023年第一季度净利润约1737万元,同比下降47.74% 世界关注

疯狂砍下生涯季后赛最高分!快船后场大将终于找回了状态?

强信心·开新局|雪域高原春日忙——西藏高原经济高质量发展一线见闻 世界短讯

银信科技(300231):该股换手率大于8%(04-21)

4月20日 11:16分 泛微网络(603039)股价快速拉升|今日看点

世界看点:当船闸有了“智慧大脑”

用进化拥抱变化 北汽雷驰携手张静初亮相 4.23世界读书日

珠海冠宇最新公告:一季度净亏损1.4亿元

x 广告
x 广告

Copyright @  2015-2022 亚洲家电网版权所有  备案号: 豫ICP备20022870号-9   联系邮箱:553 138 779@qq.com