鱼C论坛

 找回密码
 立即注册
查看: 2947|回复: 3

[已解决]见下列代码

[复制链接]
发表于 2023-2-23 09:00:20 | 显示全部楼层 |阅读模式

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

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

x
class New_int(int):
    def __add__(self,other):
        return int(self) + int(other)


a = New_int(1)
b = New_int(2)
第一个问题:括号内的int可以换成str吗,我试了试发现a + b可以得到正确结果3
第二个问题:括号内可以不用int吗
第三个问题:为什么这里不用init进行初始化,是因为
括号内有int使它继承了父类int的方法,其中包括init,它会自动调用init方法来初始化对象吗
最佳答案
2023-2-23 09:24:14
对于第一个问题,括号内的 int 可以换成 str。在该类中,__add__ 方法将 self 和 other 转换为 int 类型,因此输入字符串也会被转换为整数。在这个例子中,输入的字符串中只包含数字字符,因此可以进行整数加法,得到正确的结果。

括号内不一定非要使用 int,但是如果要使用其他的类型,需要确保它们具有可以转换为整数的方法,否则 __add__ 方法可能会引发异常。在这个例子中,如果将括号内的 int 换成 float 或者其他类型,则 __add__ 方法可能会抛出 TypeError 异常。

子类继承了父类的 __init__ 方法,所以在创建 New_int 实例时,会自动调用 int 类的 __init__ 方法来初始化对象。如果子类中定义了自己的 __init__ 方法,那么需要显式地调用父类的 __init__ 方法,以确保对象被正确初始化。在这个例子中,由于没有定义 __init__ 方法,因此 int 类的 __init__ 方法会被自动调用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-23 09:24:14 | 显示全部楼层    本楼为最佳答案   
对于第一个问题,括号内的 int 可以换成 str。在该类中,__add__ 方法将 self 和 other 转换为 int 类型,因此输入字符串也会被转换为整数。在这个例子中,输入的字符串中只包含数字字符,因此可以进行整数加法,得到正确的结果。

括号内不一定非要使用 int,但是如果要使用其他的类型,需要确保它们具有可以转换为整数的方法,否则 __add__ 方法可能会引发异常。在这个例子中,如果将括号内的 int 换成 float 或者其他类型,则 __add__ 方法可能会抛出 TypeError 异常。

子类继承了父类的 __init__ 方法,所以在创建 New_int 实例时,会自动调用 int 类的 __init__ 方法来初始化对象。如果子类中定义了自己的 __init__ 方法,那么需要显式地调用父类的 __init__ 方法,以确保对象被正确初始化。在这个例子中,由于没有定义 __init__ 方法,因此 int 类的 __init__ 方法会被自动调用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-23 09:29:17 | 显示全部楼层
第一个问题:
除非你想得到的结果是它们拼接后的字符串,否则不应该换成 str
>>> class New_int(int):
...     def __add__(self,other):
...         return str(self) + str(other)
...
>>> a = New_int(1)
>>> b = New_int(2)
>>> a + b
'12'
>>>

你改成 str 后还是得到 3 的话,你可能是没有重新实例化

第二个问题:括号内可以不用 int,但是不能直接用 self + other,

因为 self 就是 New_int 类型,它在进行加法的时候会去调用 New_int 的 __add__ 方法,

然后在 New_int 的 __add__ 方法里面又去进行加法,这样就形成无限递归了,所以不能直接用 self 来加

如果你不用 int() 转成 int 类型的话,也可以去调用父类也就是 int 的 __add__ 方法,下面三种方式都是可以的
class New_int(int):
    def __add__(self,other):
        return super().__add__(other)
class New_int(int):
    def __add__(self,other):
        return int(self).__add__(other)
class New_int(int):
    def __add__(self,other):
        return int.__add__(self, other)

第三个问题:
这里不定义 __init__ 方法,是因为不需要对它的初始化进行个性化定制,所以就让它使用从父类继承过来的 __init__ 方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-23 11:38:07 | 显示全部楼层
isdkz 发表于 2023-2-23 09:29
第一个问题:
除非你想得到的结果是它们拼接后的字符串,否则不应该换成 str

第一个问题是指将括号内的int改为str哦,不是括号外的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 13:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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