daisanosng 发表于 2020-5-23 18:36:24

python魔方方法反运算

class New_int(int):
    def __radd__(self,other):
      returnint.__sub__(other,self)

a=New_int(1)
b=New_int(2)
print(a+b)

疑问:小甲鱼说a对象默认有__add__()方法,所以b的__radd__()没有执行,但是在New_int中没有定义__add__()方法啊,怎么会有这个__add__方法。

永恒的蓝色梦想 发表于 2020-5-23 18:39:12

New_int 继承了 int 的 __add__() 方法

KevinHu 发表于 2020-5-23 18:39:43

New_int继承了int的方法,自然也就有__add__()了

daisanosng 发表于 2020-5-23 18:46:19

永恒的蓝色梦想 发表于 2020-5-23 18:39
New_int 继承了 int 的 __add__() 方法

是继承了object对象的__add__()方法吗?没有重写就默认调用object对象的__add__()方法?

daisanosng 发表于 2020-5-23 18:47:16

KevinHu 发表于 2020-5-23 18:39
New_int继承了int的方法,自然也就有__add__()了

是继承了int对象的__add__()方法吗?没有重写就默认调用int对象的__add__()方法?

永恒的蓝色梦想 发表于 2020-5-23 18:50:35

daisanosng 发表于 2020-5-23 18:46
是继承了object对象的__add__()方法吗?没有重写就默认调用object对象的__add__()方法?

我说了是 int,看不见?

daisanosng 发表于 2020-5-23 18:57:33

永恒的蓝色梦想 发表于 2020-5-23 18:50
我说了是 int,看不见?

class New_int(int):
    def __radd__(self,other):
      returnint.__sub__(other,self)

a=New_int(1)
print(dir(a))
b=int(2)
print(dir(b))
print(b+a)

运行结果:
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dict__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__module__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
1

疑问:通过dir()函数查找,b对象有__add__()方法,为什么不调用b对象的__add__()方法,而调用a对象的
__radd__()方法?

永恒的蓝色梦想 发表于 2020-5-23 19:10:12

daisanosng 发表于 2020-5-23 18:57
class New_int(int):
    def __radd__(self,other):
      returnint.__sub__(other,self)


你听课了吗?

daisanosng 发表于 2020-5-23 19:42:46

永恒的蓝色梦想 发表于 2020-5-23 19:10
你听课了吗?

有什么,你直说,我看书的。

_荟桐_ 发表于 2020-5-23 23:14:29

class 类名(继承的类的名字):

_2_ 发表于 2020-5-24 08:32:45

daisanosng 发表于 2020-5-23 18:57
class New_int(int):
    def __radd__(self,other):
      returnint.__sub__(other,self)


你把左操作数和右操作数的概念混淆了
在执行 a + b 的时候,因为 a 默认有 __add__() 方法,所以 b 的 __radd__() 没有执行
只有 b 作为 右操作数且左操作数没有 __add__() 方法的时候才会执行 __radd__()

daisanosng 发表于 2020-5-24 13:15:23

_2_ 发表于 2020-5-24 08:32
你把左操作数和右操作数的概念混淆了
在执行 a + b 的时候,因为 a 默认有 __add__() 方法,所以 b 的 _ ...

你仔细看下,print(b+a),b是左操作数且通过dir(b)查看有__add__()方法,但还是调用了右操作数的__radd__()方法,我举的例子和小甲鱼的不同,b是int()函数生成的。

zwhe 发表于 2020-5-28 10:25:08

{:7_126:}
页: [1]
查看完整版本: python魔方方法反运算