|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 jiangyangcn 于 2019-5-7 00:31 编辑
先贴一段python第43讲课后作业的代码,举个栗子:
class Word(str):
def __new__(cls,arg):
if ' ' in arg:
arg = arg.partition(' ')[0]
return str.__new__(cls,arg)
def __init__(self,arg):
print(arg)
self.len = len(arg)
来看看传入字符串没有空格的时候,结果:
支字符串含有空格,需要再__new__中修改字符串时,结果:
问题:
为什么__new__中被修改的参数无法传递到__init__?
从第二个结果可以看到,__init__函数得到的不是__new__函数修改过的参数,而是传入__new__函数的原本参数。我想要看到的是,__init__函数得到经过修改后的参数. 比如,w=Word("I love fishc.com“), 这一句,我希望看到直接打印的是"I",而不是“I love fishc.com”。既然不能得到想要的参数,我想问为什么会这样?
才网上查找了一番资料,__new__返回的是cls的实例对象,然后这个实例对象再调用cls的__init__啊?
一点点猜想:
刚刚拉了个搞机(手机)群的搞开发的群友讨论了一下。群友给了几点说法,很老道,也很套路。
1.你在__new__里改了arg,但是arg只在那个函数体里被更改了,等于就是传了个值
2.本身py有些东西就是莫名其妙的
3.要真的解释估计得去看解释器源码
我结合这位群友的看法,大概猜一下这个问题的原因。
1.Word类的__init__根本没有被生成的实例首先调用,该实例对象调用的是父类str的__init__。所以调用实例w也可以得到正确答案,"I"
2.然后,python才把Word的参数原原本本地传给了本类__init__进行初始化。所以初始化时,打印的不是正确答案,"I love Fishc.com"
最后,我会继续把这个问题挂几天(不超过一周),希望有想法可以交流。
|
|