stone_qaq 发表于 2020-2-13 17:31:41

小甲鱼第43课的课后作业

答案代码如下:
class Word(str):
    def__new__(cls,word):
      if ' 'in word:
            print'Value contains spaces.Truncating to the first spacd.'
            word=word[:word.index(' ')]
            return str.__new__(cls,word)
这里对 return str.__new__(cls,word)不是很理解,
为什么返回值给到了基类的__new__(cls,word)呢
基类的__new__本来应该是默认的objest的函数吧

我知道__new__是创建一个实例对象用到的函数
求大佬能说下,这里的返回给基类是什么道理呢

感谢感谢

zltzlt 发表于 2020-2-13 17:34:20

return str.__new__(cls,word)

这里是让父类的 __new__ 去处理 word。如果直接 return word,类型是不一样的。

>>> class Word(str):
        def __new__(cls, word):
                return str.__new__(cls, word)

       
>>> type(Word('Python'))
<class '__main__.Word'>
>>> class Word(str):
        def __new__(cls, word):
                return word

       
>>> type(Word('Python'))
<class 'str'>

stone_qaq 发表于 2020-2-13 18:57:12

zltzlt 发表于 2020-2-13 17:34
这里是让父类的 __new__ 去处理 word。如果直接 return word,类型是不一样的。

我的理解是处理好后的对象再传递给这个子类的init?
怎么回到这个子类呢。。。不是交给父类的new去创建了吗

zltzlt 发表于 2020-2-13 19:00:03

stone_qaq 发表于 2020-2-13 18:57
我的理解是处理好后的对象再传递给这个子类的init?
怎么回到这个子类呢。。。不是交给父类的new去创建了 ...

它会自动执行子类的 __init__() 。

>>> class A(str):
        def __init__(self, word):
                print("__init__()")
                super().__init__()
        def __new__(cls, word):
                return str.__new__(cls, word)

       
>>> a = A('a')
__init__()

stone_qaq 发表于 2020-2-13 19:57:12

zltzlt 发表于 2020-2-13 19:00
它会自动执行子类的 __init__() 。

class A(str):
        def __new__(cls, word):
                return str.__new__(cls, word)
      def __init__(self, word):
                print("__init__()")
                super().__init__()
               
SyntaxError: inconsistent use of tabs and spaces in indentation
为啥会报缩进的错呢。。。我也检查了没问题呀

byqkitty 发表于 2020-2-18 22:12:20

把缩进前面的空格删掉就好了

bravsheng 发表于 2021-8-6 17:49:45

zltzlt 发表于 2020-2-13 17:34
这里是让父类的 __new__ 去处理 word。如果直接 return word,类型是不一样的。

噢,原来new处理过后类型不一样!
页: [1]
查看完整版本: 小甲鱼第43课的课后作业