一锅兔子 发表于 2022-1-13 20:26:45

关于魔法方法的疑惑:为什么要用魔法方法,在什么时候使用魔法方法

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

比如求和,这样写
class A ():
        def he (self,x,y):
                self.he=x+y
a=A()
>>> a.he(3,5)
>>> a.he
8

和这样写
class A(int):
        def __add__(self,x):
                return int.__add__(self,x)

>>> a=A(3)
>>> b=A(5)
>>> a+b
8

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

一锅兔子 发表于 2022-1-13 22:08:17

{:10_254:}

一锅兔子 发表于 2022-1-14 10:00:50

{:5_94:}

lhgzbxhz 发表于 2022-1-14 20:38:45

方法而的作用是自定义运算符操作
比如说你要写一个表示复数的Complex类,需要提供一个“加”操作,这时候是写一个add()方法还是写一个__add__()魔法方法呢?
如果是.add()方法,使用者就得这么写:
complex1.add(complex2.add(complex3.add(complex4)))
而如果是魔法方法,就可以这么写:
complex1 + complex2 + complex3 + complex4
这样一来,代码更清晰,使用起来也更符合逻辑了

isdkz 发表于 2022-1-17 13:21:08

本帖最后由 isdkz 于 2022-1-17 13:22 编辑

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

eg:
a = int(1)
b = int(2)
a + b 等同于 a.__add__(b)
页: [1]
查看完整版本: 关于魔法方法的疑惑:为什么要用魔法方法,在什么时候使用魔法方法