鱼C论坛

 找回密码
 立即注册
查看: 1630|回复: 4

[已解决]关于魔法方法的疑惑:为什么要用魔法方法,在什么时候使用魔法方法

[复制链接]
发表于 2022-1-13 20:26:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近学到了魔法方法的相关内容,一直非常困惑,不理解为什么要使用魔法方法。

比如求和,这样写
  1. class A ():
  2.         def he (self,x,y):
  3.                 self.he=x+y
复制代码
  1. a=A()
  2. >>> a.he(3,5)
  3. >>> a.he
  4. 8
复制代码


和这样写
  1. class A(int):
  2.         def __add__(self,x):
  3.                 return int.__add__(self,x)
复制代码

  1. >>> a=A(3)
  2. >>> b=A(5)
  3. >>> a+b
  4. 8
复制代码


两者的应用有什么区别吗,方法二不是很好理解,而且写起来也更麻烦,还更容易出错
什么情况使用方法一,什么情况才用方法二呢?
方法二优点是什么呢?


最佳答案
2022-1-14 20:38:45
方法而的作用是自定义运算符操作
比如说你要写一个表示复数的Complex类,需要提供一个“加”操作,这时候是写一个add()方法还是写一个__add__()魔法方法呢?
如果是.add()方法,使用者就得这么写:
  1. complex1.add(complex2.add(complex3.add(complex4)))
复制代码

而如果是魔法方法,就可以这么写:
  1. complex1 + complex2 + complex3 + complex4
复制代码

这样一来,代码更清晰,使用起来也更符合逻辑了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-13 22:08:17 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-14 10:00:50 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-1-14 20:38:45 | 显示全部楼层    本楼为最佳答案   
方法而的作用是自定义运算符操作
比如说你要写一个表示复数的Complex类,需要提供一个“加”操作,这时候是写一个add()方法还是写一个__add__()魔法方法呢?
如果是.add()方法,使用者就得这么写:
  1. complex1.add(complex2.add(complex3.add(complex4)))
复制代码

而如果是魔法方法,就可以这么写:
  1. complex1 + complex2 + complex3 + complex4
复制代码

这样一来,代码更清晰,使用起来也更符合逻辑了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-17 13:21:08 | 显示全部楼层
本帖最后由 isdkz 于 2022-1-17 13:22 编辑

魔法方法是解释器会根据对象的行为自动去调用的方法,比如说你自己写了个add()方法返回值为两个对象相加,那你要使用的时候就得自己去显式调用,甚至另一个对象也需要你自己手动传进去
  1. 对象.add(另一个对象)
复制代码
,而在python的操作符中是有加法这个操作的,而这个加法操作就由python解释器去自动调用了__add__()方法,你如果重写了__add__()方法,就可以直接使用
  1. 对象 + 另一个对象
复制代码
,这样是不需要自己显式去调用__add__()方法的,传参都省了,当然你想显式调用也还是可以的,就像这样
  1. 对象.__add__(另一个对象)

  2. eg:
  3. a = int(1)
  4. b = int(2)
  5. a + b 等同于 a.__add__(b)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-14 02:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表