首页 > 资讯 >

Python面向对象编程-魔术方法-__call__和__getattr__方法 全球今日报

2023-04-21 15:57:09 来源:腾讯云

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

上一篇:

下一篇:

x
推荐阅读

Python面向对象编程-魔术方法-__call__和__getattr__方法 全球今日报

1999元!倍思户外电源降价,600W、220V大功率-全球快资讯

环球滚动:营收超87亿!华致酒行基本面稳定,看好2023复苏弹性和新增长空间

这五大技术,正在深刻改变医疗领域 讯息

当涂县气象局发布大风蓝色预警【IV级/一般】

go的数据类型-其他数据类型-channel(二)|世界快讯

太平洋惊现浮积垃圾生态圈_实时焦点

用静止的文字刻画立体的生命——聂茂《永不熄灭的心灯》读后

耿建翌的艺术犹如一场幽默的沉浸式戏剧|信息

每日信息:宁繁体字怎么写 宁繁体字

防风防风!大风蓝色预警中!最低气温12℃-世界快看点

港口岸电设施要建好更要用好

金至尊黄金价格今天多少一克(2023年04月21日)

新柴股份:4月20日融资买入118.37万元,融资融券余额3902.97万元-每日报道

农业农村部:一季度农产品进出口总额833.8亿美元,同比增长11.6%

【当前独家】长春高新跌3.35% 西部证券东莞证券在其高点唱多

环球热议:广东佛山专利分析为战略性产业发展精准“导航”

最资讯丨4月20日河南赛腾聚合氯化铝价格平稳

天天消息!瀚川智能:4月20日融券卖出8200股,融资融券余额2.41亿元

字母缺席仍16分大胜!霍勒迪24+5,两替补39+8,巴特勒25+3捂嘴笑-天天观热点

黑龙江大庆发生赛车事故:车手驾车冲出赛道不幸身亡

八年级毕业派对创意_70岁的老爸过生日送什么礼物|世界看点

环球看热讯:明德新民止于至善的思考与感悟_明明德 新民 止于至善

全球快消息!重金“砸”电商,两次股权激励实控人后,知原药业冲刺IPO

每日动态!春光科技(603657.SH):2022年净利润下降10.95%至9834.47万元 拟10派3元

济南植物园一日游 体验樱花的浪漫牡丹的富贵

当前视讯!玉溪易门:烟区产业综合体奏响“致富曲”

看点:好听的韩国歌曲经典情歌_好听的韩国歌曲

一天中最好的除螨时间?

孙颖莎让二追三,究竟是怎么一回事? 全球速读

世界微资讯!网传车展上区别对待访客,宝马最新回应:对工作人员管理不善

天津租房信息 58同城_天津租房赶集网 观察

中石化油服(01033.HK):4月20日南向资金增持153万股

爱妃别想逃(王的宠妃爱妃别想逃)

当前视讯!吃山楂片的好处和坏处?

环球通讯!天津市网信办依法处置一批违法违规“自媒体”账号

【环球快播报】象棋王子车祸 象棋王第二部

上高县气象台解除大雾黄色预警信号【III级/较重】 观察

武汉大学新增3个本科专业_快资讯

常州至宜兴阳羡山湖音乐节接驳专线时间+上车点+票价+入口

2023广州周柏豪演唱会几点开始?-今日快看

预计未来5到10年农业农村投资需求近15万亿元

报道:雷军上海车展学艺,“就差拿皮尺量了”

网上相亲找对象靠谱吗(网络相亲找对象,真的那么靠谱吗?) 天天观焦点

焦点速讯:打字手法不对怎么更正_打字手法

【公式默写本】记不住中级会计财务管理公式?财管公式默写本免费下载!-全球时讯

热点!中邮证券给予航宇科技买入评级 航空、能源领域需求旺盛 业绩有望保持较快增长

最新快讯!不到2000?这种影像神机,有点过分了

每日资讯:研报掘金 | 东吴证券:科思股份盈利水平逐季提升 维持“买入”评级

【独家焦点】晶科能源(JKS.US)将于4月28日美股盘前公布Q1业绩