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__方法。 New_int 继承了 int 的 __add__() 方法 New_int继承了int的方法,自然也就有__add__()了 永恒的蓝色梦想 发表于 2020-5-23 18:39
New_int 继承了 int 的 __add__() 方法
是继承了object对象的__add__()方法吗?没有重写就默认调用object对象的__add__()方法? KevinHu 发表于 2020-5-23 18:39
New_int继承了int的方法,自然也就有__add__()了
是继承了int对象的__add__()方法吗?没有重写就默认调用int对象的__add__()方法? daisanosng 发表于 2020-5-23 18:46
是继承了object对象的__add__()方法吗?没有重写就默认调用object对象的__add__()方法?
我说了是 int,看不见? 永恒的蓝色梦想 发表于 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__()方法? daisanosng 发表于 2020-5-23 18:57
class New_int(int):
def __radd__(self,other):
returnint.__sub__(other,self)
你听课了吗? 永恒的蓝色梦想 发表于 2020-5-23 19:10
你听课了吗?
有什么,你直说,我看书的。 class 类名(继承的类的名字): 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__() _2_ 发表于 2020-5-24 08:32
你把左操作数和右操作数的概念混淆了
在执行 a + b 的时候,因为 a 默认有 __add__() 方法,所以 b 的 _ ...
你仔细看下,print(b+a),b是左操作数且通过dir(b)查看有__add__()方法,但还是调用了右操作数的__radd__()方法,我举的例子和小甲鱼的不同,b是int()函数生成的。
{:7_126:}
页:
[1]