wangye666 发表于 2022-12-30 17:01:12

类和对象问题

1、class capstr(str):
    def __new__(cls,string):
      string=string.upper()
      return super().__new__(cls,string)
2、class capstr(str):
    def __new__(cls,string):
      string=string.upper()
      return string
cap=capstr("fishc")
cap.lower
这两种方法都能实现下面的操作,第一种(视频给出的)的返回值super().__new__(cls,string)有什么作用吗?

lxping 发表于 2022-12-30 23:57:26

第一种的返回值return super().__new__(cls,string),能够让你在实例化对象的时候得到一个类的实例化对象
第二种的返回值return string 虽然能得到一样的结果,但是返回的是string, 所以类型就变成了 str 类 ,并不是 capstr 类

wangye666 发表于 2022-12-31 09:03:00

lxping 发表于 2022-12-30 23:57
第一种的返回值return super().__new__(cls,string),能够让你在实例化对象的时候得到一个类的实例化对象
...

super()的作用不就是调用capstr的未绑定父类str吗,如果是这样的话不就和第二种的返回值的类型一样吗?

lxping 发表于 2022-12-31 09:58:33

wangye666 发表于 2022-12-31 09:03
super()的作用不就是调用capstr的未绑定父类str吗,如果是这样的话不就和第二种的返回值的类型一样吗?

你可以用type()函数对返回值的类型做一下比较

阿奇_o 发表于 2022-12-31 20:07:39

一样的。 只是第一种更规范、更实际些(涉及继承,一般都会用到super )。      
因为capstr继承了str类,super().__new__(cls,string) 即相当于 str.__new__(cls, string)即 str(string) 如 str( 'alice'.upper() )--> 'ALICE'   
要理解的是 str(x) 包括 str的 __new__(cls, ...) 和__init__(self, ...) , 是先 __new__ 生成和返回一个实例self,然后给到 __init__ 进行绑定。
页: [1]
查看完整版本: 类和对象问题