W1ND123 发表于 2021-11-9 16:57:16

第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)里面不是应该继承整型吗

suchocolate 发表于 2021-11-9 17:30:51

class Nstr(int): 指明父类的时候就自动集成了,如果要重写魔法函数,就在下面写就行了。

jackz007 发表于 2021-11-9 17:39:22

本帖最后由 jackz007 于 2021-11-9 17:40 编辑

      return int.__new__(cls, arg)
      是的,你看 __new__() 最后调用的是 int 的方法 int . __new__() ,所使用的参数 arg 确实是一个整数。那么,这就说明 Nstr 类的属性确实是个整数,只不过经过扩展以后,可以用字符串来进行初始化,除此以外,通过 Nstr 创建的对象与普通的整型数无异,拥有 int 类所有的属性和方法,如,可以 +、-、*、/ 等等。

W1ND123 发表于 2021-11-9 20:56:51

jackz007 发表于 2021-11-9 17:39
是的,你看 __new__() 最后调用的是 int 的方法 int . __new__() ,所使用的参数 arg 确实是一个 ...

哦,我大概明白了你的意思,那还有个问题就是,你说是因为经过扩展所以可以用字符串初始化,那么我想知道我们扩展的代码在那一部分体现了呢,谢谢,望回复~

jackz007 发表于 2021-11-9 21:21:56

本帖最后由 jackz007 于 2021-11-9 21:25 编辑

       int 是有 __new__() 方法的,Nstr 的 __new__() 方法就是在调用 int . __new__() 创建对象前,先对参数 arg 进行必要的处理,然后,才把参数 arg 传递给 int . __new()__ 正常创建 int 型的对象。前面已经说过,Nstr 对 int 的全部扩展就体现在可以接受字符串对对象进行初始化。此后,这个对象不过就是一个普通的整型数。

W1ND123 发表于 2021-11-9 21:24:38

jackz007 发表于 2021-11-9 21:21
int 是有 __new__() 方法的,Nstr 的 __new__() 方法就是全部扩展的内容。前面已经说过,Nstr 对 in ...

明白了!十分感谢您耐心的回答!!

hornwong 发表于 2021-11-25 22:50:42

{:5_95:}
页: [1]
查看完整版本: 第42讲课后作业动手提2