鱼C论坛

 找回密码
 立即注册
查看: 2815|回复: 3

关于字符串__new__重写求解惑

[复制链接]
发表于 2015-6-2 09:30:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
class CapStr(str):
        def __new__(cls,string): #这个cls是不是类似self的绑定效果啊?
                string = string.upper()
                return str.__new__(cls,string)
因为基类(str)的__new__不能修改,所以用CapStr继承然后修改 __new__方法,最后用基类(str)的__new__去调用?无法理解啊。。。
视频说把string作为参数传入str.__new__,为什么要这么做?我看拓展阅读里面说除了第一个参数,其他都是传给__init__ 方法的,SO,__init__不用修改吗。。。

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-6-2 12:07:35 | 显示全部楼层
正好看了这集。
第一句,因为基类(str)的__new__不能修改,我理解是str是内置方法,可能 不知道怎么去修改,或者最好不要去修改它本来的__new__方法,否则你在用字符串的时候都会有问题
第二句,用CapStr继承然后修改 __new__方法,创建一个新的类CapStr,它继承的str的所有属性,只是在创建时把字母都变为大写,这里为什么要重写__new__方法而不是__init__方法,甲鱼小哥说的很清楚,因为CapStr继承了str类不能修改的特性,所以在__init__方法中无法对self,也就是字符串本身进行修改
第三句,最后用基类(str)的__new__去调用,__new__方法是真正的创建实例的方法,而__init__方法是在已经创建好实例后,对它进行初始化的工作,如果你学过c语言,你可以这么理解int a; a = 0;,对于这两条语句 ,int a创建了一个int型变量a,它相当时__new__所做的工作,a = 0给a赋了一个初始值,它相当于__init__做的工作

回过头来看这个例子,根据第二句,如果不修改__new__方法,那么在__init__方法中的self会是一个字符串,无法修改,那么怎么办,必须在__new__方法中就按照我们需要的方式创建好新的字符串并做为__new__的返回值,那么传入str.__new__(cls,string) 中的string就必须是已经把字母全部变成大写的字符串,至于__init__函数要不要修改,任务其实已经完成了,字符串中的所有字母都已经是大写了,__init__方法只需要按之前一样的过程初始化这个字符串就ok了

PS:语文比较渣,还是不懂的话请轻拍~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-2 12:27:49 | 显示全部楼层
lightninng 发表于 2015-6-2 12:07
正好看了这集。
第一句,因为基类(str)的__new__不能修改,我理解是str是内置方法,可能 不知道怎么去修改 ...

把你的回答跟小甲鱼的讲解对比起来看好理解多了。不过总觉得有什么逻辑过不去,先记着好了,真的用到的时候在回来看。谢谢喽
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-3 10:20:05 | 显示全部楼层
学习学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-16 08:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表