只爱整活周淑怡 发表于 2020-8-18 20:42:04

关于new方法 求看看


class CapStr(str):
      def __new__(cls,string):
             string=string.upper()
             return str.__new__(cls,string)
a=CapStr('I love fishc')

这里的str.__new__(cls,string)为什么不是CapStr.__new__(cls,string),调用的不应该是capstr内的方法吗,还有就是str.__new__中的new方法是我定义的这个new方法还是另外只专属于str自身的new方法??有点绕

qiuyouzhi 发表于 2020-8-18 20:43:21

要是按你那样就陷入无限递归了耶

Twilight6 发表于 2020-8-18 20:52:52



这里的str.__new__(cls,string)为什么不是CapStr.__new__(cls,string),调用的不应该是capstr内的方法吗

这里 str.__new__(cls,string) 是调用 str 的 __new__ 方法,而你 CapStr.__new__(cls,string) 是调用自身的 __new__

而你自身重写的__new__ 方法里面如果又再次调用CapStr.__new__(cls,string) 就会导致无限递归了

还有就是str.__new__中的new方法是我定义的这个new方法还是另外只专属于str自身的new方法??

str.__new__() 是调用 str 类中的 __new__ 方法,属于 str 类的

只爱整活周淑怡 发表于 2020-8-18 21:37:35

Twilight6 发表于 2020-8-18 20:52
这里 str.__new__(cls,string) 是调用 str 的 __new__ 方法,而你 CapStr.__new__(cls,string) 是 ...

也就是说str.__new__() 和CapStr.__new__ 两个new是不一样的方法是吧

Twilight6 发表于 2020-8-18 21:41:10

只爱整活周淑怡 发表于 2020-8-18 21:37
也就是说str.__new__() 和CapStr.__new__ 两个new是不一样的方法是吧


是的

你str 的 __new__ 是之前写好自带的 __new__ 方法,有自己的功能, 而你的定义的 CapStr 类 继承了 str 类,那么也会继承 __new__ 方法

但是这里你重写了 __new__ 方法,所以此时将原先继承的 __new__ 方法给覆盖了 ,所以 __new__ 失去了原有的功能,但是你最后调用会 str 类的 __new__ 方法

那么此时你重写的 __new__ 方法又含有自己重写的代码,而且还有原来的__new__ 方法的功能

只爱整活周淑怡 发表于 2020-8-18 22:11:43

Twilight6 发表于 2020-8-18 21:41
是的

你str 的 __new__ 是之前写好自带的 __new__ 方法,有自己的功能, 而你的定义的 CapStr 类...

噢噢整明白了 谢谢谢谢
页: [1]
查看完整版本: 关于new方法 求看看