|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 wbzxz 于 2023-6-18 15:54 编辑 class S(str):
def __add__(self, other):
return len(self) * len(other)
class S1(str):
def __add__(self, other):
return NotImplemented
class S2(str):
def __radd__(self, other):
return len(self) + len(other)
class S3(str):
def __iadd__(self, other):
return len(self) + len(other)
class S4(str):
pass
class S5():
pass
s = S('FishC')
s1 = S1('Apple')
s2 = S2('Banana')
s3 = S3('Orange')
s4 = S4('Pear')
s5 = S5
print('s类型: ',type(s), s)
print('s1类型: ',type(s1), s1)
print('s2类型: ',type(s2), s2)
print('s3类型: ',type(s3), s3)
print('s4类型: ',type(s4), s4)
print('s5类型: ',type(s5), s5)
print('"nwu"类型: ',type('nwu'))
print('-' * 20)
print('s + s:', s + s)
print('s + s1:', s + s1)
print('s + s2:', s + s2)
print('s + s3:', s + s3)
print('s + s4:', s + s4)
# print('s + s5:', s + s5)
print("s + 'nwu':", s + 'nwu')
print('-' * 20)
# print('s1 + s:', s1 + s)
# print('s1 + s1:', s1 + s1)
print('s1 + s2:', s1 + s2)
# print('s1+s3:', s1 + s3)
# print('s1+s4:', s1 + s4)
# print('s1+s5:', s1 + s5)
# print("s1 + 'nwu':", s1 + 'nwu')
print('-' * 20)
print('s2 + s2:', s2 + s2)
print('s2 + s:', s2 + s)
print('s2 + s1:', s2 + s1)
print('s2 + s3:', s2 + s3)
print('s2 + s4:', s2 + s4)
# print('s2 + s5:', s2 + s5)
print("s2 + 'nwu':", s2 + 'nwu')
print('-' * 20)
print('s3 + s:', s3 + s)
print('s3 + s1:', s3 + s1)
print('s3 + s2:', s3 + s2)
print("s3 + 'nwu':", s3 + 'nwu')
print('s3 + s3:', s3 + s3)
print('s3 + s4:', s3 + s4)
# print('s3 + s5:', s3 + s5)
print('-' * 20)
print('s4 + s', s4 + s)
print('s4 + s1', s4 + s1)
print('s4 + s2', s4 + s2)
print('s4 + s3', s4 + s3)
print('s4 + s4', s4 + s4)
# print('s4 + s5', s4 + s5)
print('s4 + "nwu"', s4 + "nwu")
print('-' * 20)
# print('s5 + s', s5 + s)
# print('s5 + s1', s5 + s1)
# print('s5 + s2', s5 + s2)
# print('s5 + s3', s5 + s3)
# print('s5 + s4', s5 + s4)
# print('s5 + s5', s5 + s5)
# print('s5 + "nwu"', s5 + "nwu")
print('-' * 20)
print("'nwu' + s:", 'nwu' + s)
print("'nwu' + s1:", 'nwu' + s1)
print("'nwu' + s2:", 'nwu' + s2)
print("'nwu' + s3:", 'nwu' + s3)
print("'nwu' + s4:", 'nwu' + s4)
# print("'nwu' + s5:", 'nwu' + s5)
print('-' * 20)
运行结果如下:
s类型: <class '__main__.S'> FishC
s1类型: <class '__main__.S1'> Apple
s2类型: <class '__main__.S2'> Banana
s3类型: <class '__main__.S3'> Orange
s4类型: <class '__main__.S4'> Pear
s5类型: <class 'type'> <class '__main__.S5'>
"nwu"类型: <class 'str'>
--------------------
s + s: 25
s + s1: 25
s + s2: 30
s + s3: 30
s + s4: 20
s + 'nwu': 15
--------------------
s1 + s2: 11
--------------------
s2 + s2: BananaBanana
s2 + s: BananaFishC
s2 + s1: BananaApple
s2 + s3: BananaOrange
s2 + s4: BananaPear
s2 + 'nwu': Banananwu
--------------------
s3 + s: OrangeFishC
s3 + s1: OrangeApple
s3 + s2: 12
s3 + 'nwu': Orangenwu
s3 + s3: OrangeOrange
s3 + s4: OrangePear
--------------------
s4 + s PearFishC
s4 + s1 PearApple
s4 + s2 10
s4 + s3 PearOrange
s4 + s4 PearPear
s4 + "nwu" Pearnwu
--------------------
--------------------
'nwu' + s: nwuFishC
'nwu' + s1: nwuApple
'nwu' + s2: 9
'nwu' + s3: nwuOrange
'nwu' + s4: nwuPear
--------------------
上面是代码和运行结果,代码中注释部分是出错的情况,出错的情况分为两种,一个是“object of type 'type' has no len()”,一个是“unsupported operand type(s) for +: 'S1' and 'S'”
经过分析,个人认为是按照下面的顺序执行:
如果左边有__add__方法, 执行__add__方法;
如果在左边没有__add__方法, 或者调用 __add__ 方法返回NotImplemented,就在在右边找__radd__方法, 找到就执行__radd__方法,
如果左边没有找到__add__方法, 右边没有找到__radd__方法, 那就去左边父类找__add___方法, 找到就执行__add___方法(因为代码中父类是str, 肯定可以找到__add__方法)
如果左边有__add__方法, 但是调用 __add__ 方法返回NotImplemented,右边没有找到__radd__方法, 则会报错
上面的顺序基本都能解释运行结果, 但是有一条不行, 就是'nwu' + s2: 9
个人认为, 'nwu'有__add__方法, 运行结果应该是 nwuBanana, 但是不是,不知道为什么, 请大家看看到底是哪里出错了呢?
非常抱歉,我的回答有误。你的代码确实符合规则1,当左边对象有 __add__ 方法时,会直接执行左边的 __add__ 方法。所以 s 对象的 __add__ 方法应该被调用,计算长度得到了 5,最终的结果是 "nwu" + s 等于 8。
我之前的回答有误,造成了混淆,非常抱歉给您带来困惑。
让我来解释一下你之前提供的代码。
首先,你定义了一个名为 S 的类,该类继承了 str 类,并重写了 __add__ 方法。在你调用 "nwu" + s 时,Python 会尝试将 "nwu" 和 s 进行加法运算。根据规则2,Python 会首先检查左边对象 str 是否有定义 __add__ 方法,由于字符串类型(也即 str 类型)是 Python 中基础的数据类型,因此它自己没有重写 __add__ 方法,但是作为父类却定义了该方法。因此,当 "nwu" 和 s 相加时,Python 会执行 str 类型中的 __add__ 方法,该方法会返回一个新的字符串,该字符串由 "nwu" 和 s 拼接起来组成(实际上就是字符串的拼接)。所以最终的结果是 "nwuFishC"。
希望这次回答能够帮助你理解你之前的代码。如果你还有任何问题,请随时问我。
|
|