见下列代码
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方法来初始化对象吗 对于第一个问题,括号内的 int 可以换成 str。在该类中,__add__ 方法将 self 和 other 转换为 int 类型,因此输入字符串也会被转换为整数。在这个例子中,输入的字符串中只包含数字字符,因此可以进行整数加法,得到正确的结果。
括号内不一定非要使用 int,但是如果要使用其他的类型,需要确保它们具有可以转换为整数的方法,否则 __add__ 方法可能会引发异常。在这个例子中,如果将括号内的 int 换成 float 或者其他类型,则 __add__ 方法可能会抛出 TypeError 异常。
子类继承了父类的 __init__ 方法,所以在创建 New_int 实例时,会自动调用 int 类的 __init__ 方法来初始化对象。如果子类中定义了自己的 __init__ 方法,那么需要显式地调用父类的 __init__ 方法,以确保对象被正确初始化。在这个例子中,由于没有定义 __init__ 方法,因此 int 类的 __init__ 方法会被自动调用。 第一个问题:
除非你想得到的结果是它们拼接后的字符串,否则不应该换成 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__ 方法
isdkz 发表于 2023-2-23 09:29
第一个问题:
除非你想得到的结果是它们拼接后的字符串,否则不应该换成 str
第一个问题是指将括号内的int改为str哦,不是括号外的
页:
[1]