鱼C论坛

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

[已解决]魔法方法

[复制链接]
发表于 2018-8-5 10:42:46 | 显示全部楼层 |阅读模式
10鱼币
如图片所示共三段代码,小弟的疑问①是def__new__(cls,a)括号里的第二个参数是谁传给它的,经过我的实验猜测是Cap(str)里的str原封不动的传给了它,比如下面输如b=Cap('i love you')此时的str就是字符串i love you传递给了a参数,可str是基类呀,还能直接传给def__new__()第二个参数吗?
疑问②是当走到return str.__new__(cls,a)后是不是会默认执行一些代码呀比如__init__?要不然最后在交互模式下b回车[相当于print(b)]后,为何会出现变化后的代码呢。这里小弟大胆猜测并写下了第二段代码,新加了__init__(self,a)__和print(self),发现结果和第一段代码一模一样,此时的self就是变化后的a,因为new的第二个参数会传给__init__(),不知道猜的对不对?
疑问③第三段代码和第二段代码的区别在于输入__init__里的参数时,少输入了a,可此时的self不就是变化后的a传来的吗,为什么还要再加个a呢,加的这个a该怎么理解呢
叙述的不知道大佬能不能看懂?求大佬们帮忙解释解释

QQ截图20180805102141.png
最佳答案
2018-8-5 10:42:47
青春奋斗 发表于 2018-8-5 12:15
1.b是实例化后的对象呀,把b传给def__new__?
2.第二段代码里执行的是Cap类的init呀,你写的是str._init_ ...

是先__new__再__init__的。(new返回实例化对象)
1.对的
2.抱歉,我理解错了您的意思,new返回的对象就是实例化的对象,也就是说,实例化对象主要靠new。
可以做到在new中实例化对象的类估计只有内置类型了吧。
3.类类型就是指一个类型(cls,是类本身),实例化对象就是指一个对象(self,是new返回的已实例化对象)

最佳答案

查看完整内容

是先__new__再__init__的。(new返回实例化对象) 1.对的 2.抱歉,我理解错了您的意思,new返回的对象就是实例化的对象,也就是说,实例化对象主要靠new。 可以做到在new中实例化对象的类估计只有内置类型了吧。 3.类类型就是指一个类型(cls,是类本身),实例化对象就是指一个对象(self,是new返回的已实例化对象)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-5 10:42:47 | 显示全部楼层    本楼为最佳答案   
青春奋斗 发表于 2018-8-5 12:15
1.b是实例化后的对象呀,把b传给def__new__?
2.第二段代码里执行的是Cap类的init呀,你写的是str._init_ ...

是先__new__再__init__的。(new返回实例化对象)
1.对的
2.抱歉,我理解错了您的意思,new返回的对象就是实例化的对象,也就是说,实例化对象主要靠new。
可以做到在new中实例化对象的类估计只有内置类型了吧。
3.类类型就是指一个类型(cls,是类本身),实例化对象就是指一个对象(self,是new返回的已实例化对象)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-5 11:36:05 | 显示全部楼层
1.不是,当你实例化它时传给了__new__。
2.会的str.__init__
3.a是你实例化的时候传给new的参数。
是先用类类型和你自己自定义的参数调用__new__,然后用实例化对象和你自己自定义的参数调用init。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-8-5 12:15:28 | 显示全部楼层
无符号整形 发表于 2018-8-5 11:36
1.不是,当你实例化它时传给了__new__。
2.会的str.__init__
3.a是你实例化的时候传给new的参数。

1.b是实例化后的对象呀,把b传给def__new__?
2.第二段代码里执行的是Cap类的init呀,你写的是str._init_这不是基类里的吗
3.您的写法有点深奥。。。小弟太笨了没看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 17:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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