第42讲课后作业动手提2
2. 定义一个类 Nstr,当该类的实例对象间发生的加、减、乘、除运算时,将该对象的所有字符串的 ASCII 码之和进行计算:小甲鱼的代码:
class Nstr(int):
def __new__(cls, arg=0):
if isinstance(arg, str):
total = 0
for each in arg:
total += ord(each)
arg = total
return int.__new__(cls, arg)
>>> a = Nstr('FishC')
>>> b = Nstr('love')
到这里为止,class Nstr(int)里面不是应该继承整型吗
class Nstr(int): 指明父类的时候就自动集成了,如果要重写魔法函数,就在下面写就行了。 本帖最后由 jackz007 于 2021-11-9 17:40 编辑
return int.__new__(cls, arg)
是的,你看 __new__() 最后调用的是 int 的方法 int . __new__() ,所使用的参数 arg 确实是一个整数。那么,这就说明 Nstr 类的属性确实是个整数,只不过经过扩展以后,可以用字符串来进行初始化,除此以外,通过 Nstr 创建的对象与普通的整型数无异,拥有 int 类所有的属性和方法,如,可以 +、-、*、/ 等等。 jackz007 发表于 2021-11-9 17:39
是的,你看 __new__() 最后调用的是 int 的方法 int . __new__() ,所使用的参数 arg 确实是一个 ...
哦,我大概明白了你的意思,那还有个问题就是,你说是因为经过扩展所以可以用字符串初始化,那么我想知道我们扩展的代码在那一部分体现了呢,谢谢,望回复~ 本帖最后由 jackz007 于 2021-11-9 21:25 编辑
int 是有 __new__() 方法的,Nstr 的 __new__() 方法就是在调用 int . __new__() 创建对象前,先对参数 arg 进行必要的处理,然后,才把参数 arg 传递给 int . __new()__ 正常创建 int 型的对象。前面已经说过,Nstr 对 int 的全部扩展就体现在可以接受字符串对对象进行初始化。此后,这个对象不过就是一个普通的整型数。 jackz007 发表于 2021-11-9 21:21
int 是有 __new__() 方法的,Nstr 的 __new__() 方法就是全部扩展的内容。前面已经说过,Nstr 对 in ...
明白了!十分感谢您耐心的回答!! {:5_95:}
页:
[1]